C标准规定(强调我的):
21例2声明后:
struct s { int n; double d[]; };
结构struct
s
具有灵活的数组成员d
。[...]
22在上述声明之后:
struct s t1 = { 0 }; // valid struct s t2 = { 1, { 4.2 }}; // invalid t1.n = 4; // valid t1.d[0] = 4.2; // might be undefined behavior
的初始化
t2
无效(并违反了约束),因为struct s
它被视为不包含memberd
。资料来源:C18,§6.7.2.1/ 20 + / 21
我不理解“因为struct s
被视为不包含成员d
”的解释
如果我使用的初始化器{ 1, { 4.2 }};
,那{ 4.2 }
部分是初始化灵活数组成员; 确切地说,是将柔性数组成员初始化为由一个元素组成,然后将此元素初始化为值4.2
,stuct s
是否将其视为具有成员d
?
在我看来,这句话毫无意义。
{ 4.2 }
不会初始化/表示灵活数组成员,因此该结构将被视为没有成员一样d
?如果我使用固定大小的数组,则该表示法可以正常工作并初始化成员,而不会产生任何抱怨:
struct foo {
int x;
double y[1];
};
int main (void)
{
struct foo a = { 1, { 2.3 } };
}
您能详细说明一下吗?
我读了:
和
和
和其他人,但没有一个回答我这句话想解释什么以及为什么这实际上是无效的。
有关:
我猜这是语言缺陷。尽管初始化灵活的数组成员可能没有任何意义,但该标准需要在某个地方解决该问题。我在任何地方都找不到这样的规范文本。
灵活数组成员的定义为C17 6.7.2.1/18:
作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为弹性数组成员。在大多数情况下,柔性数组成员将被忽略。特别地,该结构的尺寸就好像省略了柔性阵列构件,除了其可能具有比省略所暗示的更多的尾随填充。
由此可知,灵活的数组成员是不完整的数组类型。但是,除了计算结构的大小时,我们不会了解在什么情况下会忽略柔性数组成员。“在大多数情况下”无济于事,并且是缺陷–需要扩展为详尽的列表,包括在初始化列表的一部分时灵活数组成员的行为。否则,可能会假定它的行为与其他任何不完整类型的数组一样。
C17 6.2.5 / 22:
大小未知的数组类型是不完整的类型。
然后初始化规则说,C17 6.7.9:
要初始化的实体的类型应为未知大小的数组或不是可变长度数组类型的完整对象类型。
到目前为止,尚无规范性文字说明不允许我们为灵活数组成员提供初始化程序-相反。问题中的示例(C17 6.7.2.1示例21)不是规范性的,因为示例在ISO标准中不是规范性的。该示例没有提到违反了哪个约束,也没有提到必须忽略灵活数组成员的位置。
我想我可能会为此提交DR。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句