结构中的Unsized数组声明

sas*_*ang 12 c arrays flexible-array-member

为什么C允许这样:

typedef struct s
{
  int arr[];
} s;

数组arr没有指定大小?

Sha*_*our 12

这是C99特性称为灵活数组,其主要特征是允许使用变量长度数组中的结构R中的特征..在这个答案中,灵活数组成员的另一个问题提供了使用灵活数组而不是指针的一系列好处.该草案C99标准的部分6.7.2.1 结构和联合说明16说:

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这被称为灵活的阵列成员.在大多数情况下,将忽略灵活数组成员.特别地,结构的尺寸好像省略了柔性阵列构件,除了它可以具有比省略意味着更多的拖尾填充.[...]

因此,如果你有一个,s*你将为数组分配空间以及结构所需的空间,通常你会在结构中有其他成员:

s *s1 = malloc( sizeof(struct s) + n*sizeof(int) ) ;
Run Code Online (Sandbox Code Playgroud)

标准草案实际上在第17段中有一个有启发性的例子:

示例声明后:

  struct s { int n; double d[]; };
Run Code Online (Sandbox Code Playgroud)

结构struct s具有灵活的数组成员d.使用它的典型方法是:

   int m = /* some value */;
   struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
Run Code Online (Sandbox Code Playgroud)

并且假设调用malloc成功,p 对于大多数目的,行为所指向的对象就像p被声明为:

    struct { int n; double d[m]; } *p;
Run Code Online (Sandbox Code Playgroud)

(在某种情况下,这种等同性被破坏;特别是,成员的抵消d可能不一样).

  • 它用gcc -std = c89编译 (2认同)
  • OP的例子实际上是不正确的.该结构必须至少有两个成员,其中一个可以是柔性阵列成员. (2认同)