【发布时间】:2018-04-01 12:35:05
【问题描述】:
我正在阅读由维基百科链接的this version of the C99 standard,试图了解灵活数组成员的工作原理。
在第 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 的行为和s2 如果它们被声明为:
struct { int n; double d[1]; } *s1, *s2;
当s2 似乎没有分配足够的内存来存储该结构时。
该文件似乎是某种草稿,所以我不确定是否有错误或我是否误解了其含义。
【问题讨论】:
-
我认为你是对的。我认为该文件写得不好。此外,您将在分配时使用 offsetof() 以使实际分配的大小正确。