c - 为什么对具有灵活数组成员的结构的初始化无效但对固定大小的数组成员有效?
问题描述
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 } };
}
- 为什么当结构具有灵活的数组成员时此初始化无效但当结构具有固定大小的数组成员时有效?
你能详细说明一下吗?
我读了:
和
和
和其他人,但他们都没有回答我这句话想要解释什么以及为什么这到底是无效的。
有关的:
解决方案
我不明白“因为 struct s 被视为不包含成员 d”的解释。
C 标准还说“在大多数情况下,灵活的数组成员被忽略。” 不清楚为什么你不明白这是什么意思。如果struct s
是声明struct s { int n; double d[]; };
的,那么在大多数情况下,C 实现的行为就像是声明的一样struct s { int n; };
。因此,struct s t2 = { 1, { 4.2 }};
失败是因为它4.2
是一个实际上不存在的东西的初始化器。
明智的做法是问为什么会出现这种情况。在大多数情况下,我希望编译器可以支持一个定义,其中数组初始值设定项被计数并用于设置结构大小。当然,编译器使用数组定义来做到这一点,例如 sint a[] = { 3, 4, 5};
. 但是,这不是灵活数组成员的典型用例。通常,程序接收有关它需要使用结构管理多少元素的信息,为结构分配空间,其中包含用于这些元素的空间,然后将结构放入分配的空间中。也就是说,具有灵活数组成员的结构的典型用例是动态分配空间。我希望 C 委员会认为几乎不需要要求编译器支持静态或自动对象中的灵活数组成员,而不是动态对象。
推荐阅读
- typescript - 为什么 TS 在 console.log(add(b)) 处显示错误?
- excel - Excel 文件在使用后仍处于锁定状态以供编辑
- linux - Dockerfile 将 RUN 命令结果作为 COPY 的目标传递
- python - 如何在 Tableau 中查找重复的值
- docker - 仅在 docker 容器中使用 cmd 打开和编辑文件
- node.js - 当我单击 github 中的合并请求按钮时,是否会执行合并前提交挂钩?
- .htaccess - Nginx 等效于 Apache 查询字符串规则
- hive - Hive 分区列
- python - bootstrapshuffle 前端添加到 django 3.0 项目
- c# - 动态更改 CommandField 文本