为什么使用灵活的数组成员进行的结构初始化无效但对于固定大小的数组成员却有效?

RobertS支持Monica Cellio

C标准规定(强调我的):

21例2声明后:

struct s { int n; double d[]; };

结构structs具有灵活的数组成员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.2stuct 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

初始化struct数组成员的最有效方法?

初始化列表中的零初始化数组成员

为什么灵活数组成员的静态初始化有效?

嵌套结构中的灵活数组成员

可变长度数组和灵活数组成员之间有什么区别?

具有灵活数组成员的结构的数组如何表现?

具有灵活数组成员的结构的大小

GCC与Clang复制结构灵活数组成员

初始化固定的C数组成员结构

没有命名成员的GCC错误结构灵活数组成员

应该使用宏而不是灵活的数组成员吗?

弹性数组成员的非静态初始化?

无效使用灵活数组成员(不是其他成员)

灵活数组成员的静态初始化

未命名结构的灵活数组成员

使用std :: index_sequence初始化具有固定大小数组成员的POD结构容器

数组成员的初始化程序无效

使用数组并在结构中分配内存(灵活的数组成员)

如何均匀地分配具有灵活数组成员的结构体数组?

使用灵活的数组成员实现堆栈

当我对结构进行浅拷贝时,灵活数组成员没有被复制

为什么需要在constexpr类中成员初始化非静态数组成员?

当将值分配给结构初始化程序中的字符串数组成员时,为什么会收到“ int-conversion”警告?

为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

具有灵活数组成员的结构的“数组”

如何初始化具有 unint_t 作为灵活数组成员的结构?

如何通过引用初始化函数内部的结构数组成员

什么是结构中的灵活数组成员?

在编译时初始化灵活的数组成员