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]不考虑?

我试过了:

  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]是结构的成员。那怎么不考虑结构的大小呢?

4

3 回答 3

4

这实际上比最初看起来要复杂得多。

首先,成员int a[0]是标准 C 中的约束违规(“语法错误”)。您必须遇到编译器提供的扩展。

C99 之前的编译器经常使用零大小的数组来模拟灵活数组成员的效果,这些成员的语法int a[]没有限制,是 a 的最后一个成员struct

对于整体的大小struct,这样的数组本身不算数,但它可能会施加对齐约束。特别是,它可能会在结构的其他部分的末尾添加填充。如果你做同样的测试

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

[0]如果您的编译器需要它),您很可能会看到4或的大小8,因为这些通常是double.

于 2012-10-04T07:40:38.263 回答
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 }

如果你的银行账户里没有钱,你根本就没有钱:)

于 2012-10-04T06:53:41.157 回答
0

array零元素的大小是0.you 可以检查 .sizeof(a[0])所以它不考虑在结构的大小中。

于 2012-10-04T07:02:03.150 回答