【发布时间】:2020-10-27 15:10:56
【问题描述】:
C 标准状态(强调我的):
21 示例2声明后:
struct s { int n; double d[]; };结构结构
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被视为不包含成员d。来源: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 } };
}
- 为什么这个初始化在结构有一个灵活的数组成员时无效,但在结构有一个固定大小的数组成员时有效?
你能详细说明一下吗?
我读过:
Why does static initialization of flexible array member work?
和
How to initialize a structure with flexible array member
和
Flexible array members can lead to undefined behavior?
还有其他人,但他们都没有回答我这句话想解释什么以及为什么这是无效的。
相关:
【问题讨论】:
标签: c struct initialization language-lawyer flexible-array-member