2011-10-13 1 views
4

나는 내가 많은 장소 sizeof(*pointer)의 사용에서 관찰 한 리눅스에서 다음 프로그램차이 (* PTR)과는 sizeof (구조체)

struct temp{ 
    int ab; 
    int cd; 
}; 

int main(int argc, char **argv) 
{ 
    struct temp *ptr1; 
    printf("Sizeof(struct temp)= %d\n", sizeof(struct temp)); 
    printf("Sizeof(*ptr1)= %d\n", sizeof(*ptr1)); 
    return 0; 
} 

출력

Sizeof(struct temp)= 8 
Sizeof(*ptr1)= 8 

을 시도했다. 둘 다 동일하면 왜 sizeof(*pointer)이 사용됩니까 ??

답변

11

일반적으로 나중에 ptr이 다른 유형으로 코드를 변경하면 sizeof을 업데이트 할 필요가 없으므로 sizeof(*ptr)을 선호합니다. 실제로, 몇 줄을 더 아래로, 당신은 구조의 크기를 가지고 있다는 것을 깨닫지 않고 ptr의 유형을 변경할 수 있습니다. 유형을 중복하여 지정하지 않으면 나중에 변경해야하는 경우 실수 할 가능성이 적습니다.

이런 의미에서 "유지 보수를위한 코드"또는 "방어적인 코드"중 하나입니다.

기타 주관적인 이유가있을 수 있습니다. 자주 글자 수가 적습니다. :-)

1

sizeof은 1) 형식이있는 2) 표현식이있는 두 가지 방법 중 하나로 작동합니다. 후자의 경우는 식의 형식에 sizeof을 호출하는 것과 동일합니다.

그래서 당신이 쓸 수 있습니다 :

int a; 

char p[sizeof(int)]; 
char q[sizeof a]; 

모두 같은 일을 의미한다. 당신 만이, 나중에 *pc의 유형을 변경하기로 선택한 경우

complex_type * pc = malloc(sizeof(*pc) * 100); // room for 100 elements 

:

동적 메모리에 대한 포인터를 선언하는 표현 버전의 유틸리티를 사용하면 한 번만 유형을 밖으로 철자 필요가있다 한 곳에서 코드를 변경하십시오.