2013-07-16 2 views
0

sizeof (특히이 코드의 int) 역할을하는 간단한 코드를 작성하려고했습니다. 하지만 출력으로 1을 표시하는 이유는 무엇입니까? 4이어야합니다.크기에 대한 코드?

#include<stdio.h> 
int SIZEOF(int *); 

int main(void) 
{ 
    int a; 
    printf("Size is:%d bytes\n",SIZEOF(&a)); 

    return 0; 
} 

int SIZEOF(int *p1) 
{ 
    int *p2; 
    p2=p1; 

    p1++; 

    return (p1-p2); 
} 
+1

'p1 ++'이'sizeof (int) '만큼 증가하는 것과 같은 이유로'p1-p2'는'sizeof (int)'의 단위 차이입니다. 첫 번째는 항상 크기가 1 인'char *'으로 캐스트. – GManNickG

+0

포인터에'+ 1'을 지정하면 포인터가 다음 유형의 위치를 ​​가리키게됩니다. (이 값은 주소 값이 아니라 프로그램에서 매우 유용한 논리 증가 값입니다.) 포인터 산술은 값 산술과 다릅니다. –

답변

6

포인터 계산은 뾰족 유형의 크기 단위로 작동합니다. p1 - p2을 수행하면 int 단위의 수가 표시되고 char 단위는 표시되지 않습니다. 일부 캐스트를 추가

return (char *)p1 - (char *)p2; 

편집 주 : SIZEOF 아마 ptrdiff_t 또는 size_t를 반환해야합니다.

2

다시 포인터 연산이 실행됩니다. p1++처럼 포인터를 1 * sizeof(pointer) 씩 증가 시키면 p1-p2이 결과를 sizeof(p1)으로 나눕니다.

2

포인터 계산은 가리키는 대상의 크기를 고려합니다. 모든 데이터 형식의 배열에 포인터 p이 있으면 ++p은 데이터 크기만큼 포인터를 전진시킵니다. 두 개를 뺄 때 결과를 크기로 나눕니다.

sizeof 키워드를 사용하지 않으면 이것을 구현할 수있는 이식성이 없습니다.

관련 문제