2016-07-29 3 views
1

예상되는 것은
입니다. 1. 입력을 입력하십시오.
2. 입력을 읽고 입력 값을 반환하십시오.
3. sizeof 값을 확인하십시오.
4. sizeof 값을 인쇄하십시오.sizeof가 예상대로 작동하지 않는 이유는 무엇입니까?

그러나 첫 번째 단계는 발생하지 않습니다.

왜 첫 번째 단계가 발생하지 않습니까?

+0

나는이 얻을? – octopusgrabbus

+1

또한 문자열 끝에 '\ n'을 추가해야합니다. –

답변

4

sizeof() 함수는 대괄호 안에있는 내용을 평가하지 않습니다. 유형을보고 크기를 반환합니다. 이것은 완벽하게 안전하다 : 그 답을 알 수있는 식을 계산할 필요가 없기 때문에 그것은, 1를 반환합니다

char *ptr = NULL; // NULL ponter! 
printf("%d", sizeof(*ptr)); 

.

+1

"이것은 완전히 안전합니다."-> 실제로는 아닙니다. 'sizeof'의 결과 타입은'size_t'입니다. 일치하는'printf()'지정자는''% d ''이 아니라''% zu''입니다. – chux

1

getchar() 반환 유형이 int이기 때문에 char이 아닙니다. sizeof(int)은 플랫폼에 따라 4입니다.

또한 %zu을 사용하여 size_t 값을 인쇄해야합니다. 잘못된 형식 지정자를 사용하는 것은 기술적으로 undefined behaviour입니다.

2

예상되는 것은 1. 입력을 입력하십시오. 2. 입력을 읽고 입력 값을 반환합니다. 3. sizeof 값을 평가하십시오. 4. sizeof 값을 인쇄하십시오.

그러나 첫 번째 단계는 발생하지 않습니다. 왜 첫 번째 단계가 발생하지 않습니까?

매우 예외가 있기 때문에 sizeof 연산자는 피연산자를 평가하지 않습니다. 귀하의 사용은 예외 사항 중 하나가 아닙니다. 평가하지 않는 경우 getchar()getchar()을 의미하지 않습니다.

어떤 경우에도 코드에서 기대하는 것이 확실하지 않습니다. getchar()이 호출 되더라도이라고해도 결과는 항상 입력에 종속되지 않는 동일한 유형 (int)입니다.

@P.P.의 의견에도주의하십시오. printf() 형식이 인쇄 할 데이터 형식과 일치하지 않습니다 (size_t). 그가 보았을 때, printf() 호출은 결과로 정의되지 않은 동작을합니다.

1

C에서 sizeof 연산자는 가변 크기 배열 (VLA)에 대해서만 런타임에 평가됩니다. 그 외의 경우에는 오퍼레이터가 피연산자를 평가하거나 평가하지 않습니다. 표현식의 유형을 추론하고 추론 된 유형의 객체 크기를 반환합니다. $ gcc가 -o 임시 temp.c [steamboy의 ics_client @ ICS] [ICS @ steamboy ics_client] $ ./temp 4 ICS @ steamboy ics_client] $을에 무엇 플랫폼 :