2013-08-21 3 views
0
char c[] = {'a','b','c'}; 
int* p = &c[0]; 
printf("%i\n", sizeof(*p)); //Prints out 4 
printf("%i\n", sizeof(*c)); //Prints out 1 

이 코드 섹션에 대해 매우 혼란 스럽습니다. p와 c는 모두 0 번째 색인에있는 배열 c의 주소를 나타냅니다. 그런데 왜 sizeof (* p)가 4를 인쇄합니까? 1이 아니어야합니까?C - SizeOf 포인터

답변

5

p의 유형이 int *이므로 *pint이며 구현시 4 바이트입니다. 당신이 당신의 프로그램이 정의되지 않은 동작을 호출하지 않으려면 (어떤 sizeof 수율) size_t를 인쇄


및 사용 %zu.

+2

구현 (* cough * Microsoft * cough *)이 ""% zu "'를 지원하지 않으면'int'로 변환하고''% d"'또는' "% i"'를 사용하십시오. –

+0

@KeithThompson 예 :) (MS는 심각하게 XXI 세기에 살고 C99 이상을 지원해야합니다.) –

+1

또는 '부호없는 long'으로 변환하고''% lu "'를 사용하십시오 –

4

sizeof(*p)의 크기는 int 개체의 크기는 p입니다.

0

를 sizeof (* P)는 때문에 INT 그러나 C 4 인 (P)의 크기는 sizeof 연산자 엄격 컴파일 시간 산출 인 C (되지 C99) 중 1

0

인 이유 숯이다를 출력한다. 따라서 sizeof (*p) [역 참조 된 ptr을 정수로]를 계산하면 int의 크기는 4입니다.

참고. 그 문장의 (*p) 부분은 "캐스트"연산자입니다. 따라서 sizeof는 sizeof(xyz)과 같은 함수 호출이 아니고 sizeof var_name 또는 sizeof (int *)과 같습니다.

프로그램을 실행하면 p가 가리키는 개체가 변경되지만 sizeof (*p) 값은 이미 계산되어 실행 가능로드 모듈에 하드 코딩됩니다.

당신의 혼란은 C가 프로그램이 실행될 때 어떤 데이터 유형 p가 가리키고 있는지 알 것이라고 생각하는 것입니다.