我正在阅读维基百科链接的这个版本的 C99 标准,试图了解灵活的数组成员是如何工作的。
在第 6.7.2.1 节中,声明了这个结构:
struct s { int n; double d[]; };
并举了一个例子:
s1 = malloc(sizeof (struct s) + 10);
s2 = malloc(sizeof (struct s) + 6);
它在哪里说,s1
并且s2
会表现得好像声明是:
struct { int n; double d[1]; } *s1, *s2;
它列出了一些你可以做的事情:
double *dp;
dp = &(s1->d[0]); // valid
*dp = 42; // valid
dp = &(s2->d[0]); // valid
*dp = 42; // undefined behavior
我可以看到为什么上面的最后一行是未定义的,因为s2
只分配了 6 个额外的字节,这不足以存储双精度,但是我不明白为什么它会说s1
and的行为s2
就像它们被声明为:
struct { int n; double d[1]; } *s1, *s2;
当似乎s2
没有分配足够的内存来存储该结构时。
该文件似乎是某种草稿,所以我不确定是否有错误或者我是否误解了其含义。