2012-10-04 2 views
1
 1 #include <stdio.h> 
     2 
     3 
     4 struct test { 
     5  char c; 
     6  int i; 
     7  double d; 
     8  void *p; 
     9  int a[0]; 
    10 }; 
    11  
    12 int main (void) { 
    13  struct test t; 
    14  printf("size of struct is: %d\n", sizeof(t)); 
    15  return 0; 
    16 } 

출력 :구조의 크기

size of struct is: 20 

이 왜 int a[0] 고려하지?

는 I 시도 :

1 #include <stdio.h> 
    2 
    3 
    4 struct test { 
    5  int a[0]; 
    6 }; 
    7  
    8 int main (void) { 
    9  struct test t; 
10  printf("size of struct is: %d\n", sizeof(t)); 
11  return 0; 
12 } 

출력 :

size of struct is: 0 

a[0]는 구조 부재이다. 그렇다면 어떻게 구조의 크기로 간주되지 않습니까?

+2

int a [0]'의 크기는 어느 정도입니까? – glglgl

+0

그냥 자연스럽게 추측합니다 - a [0]은 요소가 0 인 배열이고 논리 크기는 0이됩니다. –

+0

int a [0]은 정수를 메모리에 저장합니다. – Nocturno

답변

1

지금보십시오 : 당신이 당신의 은행 계좌에 돈이 없으면

1 #include <stdio.h> 
    2 
    3 
    4 struct test { 
    5  int a[0]; 
    6 }; 
    7  
    8 int main (void) { 
    9  struct test t; 
10  printf("size of struct is: %d\n", sizeof(t)==sizeof(t.a)); 
11  return 0; 
12 } 

당신이 모든 돈을 :)이없는

0

제로 요소와 array의 크기는 우선은 0입니다 sizeof(a[0])으로 확인할 수 있습니다. 구조의 크기는 고려하지 않았습니다.

4

실제로 이것은 처음에 보일 수도있는 더 복잡합니다.

우선 int a[0]은 표준 C에서 제약 조건 위반 ("구문 오류")입니다. 컴파일러에서 제공하는 확장 프로그램을 발견해야합니다. 제로 사이즈

배열은 종종 struct의 마지막 멤버로 경계없이 구 int a[]가요 배열 부재의 효과를 모방하기 위해 미리 C99은 컴파일러에 의해 사용되었다.

전체 크기가 struct 인 경우 이러한 배열은 그 자체로 계산되지 않지만 정렬 제약 조건을 부과 할 수 있습니다. 특히 구조체의 다른 부분의 끝에 패딩을 추가 할 수 있습니다. (컴파일러가 그것을 필요로하는 경우 [0]로) 당신이

struct toto { 
    char name[3]; 
    double a[]; 
}; 

에 대해 동일한 테스트를 할 줄 경우 이러한 double의 보통 정렬 요구 사항이 있기 때문에, 당신은 가장 가능성, 4 또는 그것을위한 8의 크기를 참조하십시오.