gpt4 book ai didi

c - 错误 : variable-sized object may not be initialized| (C language)

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:44 24 4
gpt4 key购买 nike

我是编程初学者,所以我还不熟悉错误。

int integer=1;
struct myStruct **str1[integer] = malloc(sizeof(struct myStruct *));

我有这段代码,但出现以下错误:

error: variable-sized object may not be initialized|

我发现问题是由变量“整数”引起的,因为当我删除它时,我没有遇到这个错误。但我不明白为什么我会看到它,因为我已经初始化了“整数”变量。此外,我已经在此处初始化了“myStruct”结构并初始化了 str1。

有人可以帮助我吗?

最佳答案

问题是因为 integer 不是编译时整数常量(即使你将它定义为 const int integer = 1; 也不会是),您使用它声明的数组是 VLA — 可变长度数组。并且您不能为 VLA 定义初始值设定项,即使您在编译时知道大小也是如此。

C 标准说:

ISO/IEC 9899:2011 §6.7.9 Initialization

¶3 The type of the entity to be initialized shall be an array of unknown size or a complete object type that is not a variable length array type.

这是一个约束;没有回旋余地。尽管不应初始化 VLA。


进一步审查

在这种情况下,我可能会使用 1(甚至什么都不用)作为数组维度:

int integer=1;
struct myStruct **str1[1] = { malloc(sizeof(struct myStruct *)) };

或者:

int integer=1;
struct myStruct **str1[] = { malloc(sizeof(struct myStruct *)) };

请注意使用初始化程序 { ... } 大括号,这是初始化数组所必需的。

但是,您在这里尝试做什么还不是很清楚;您在 LHS 上有 3 级指针,而在 RHS 上的 sizeof 中只有 1 级。虽然 sizeof(struct myStruct *) == sizeof(struct myStruct **),但不清楚您要做什么。我怀疑你真的想要:

size_t str_size = 1;
struct myStruct **str1 = malloc(sizeof(*str_size) * str_size);

这为一个 struct myStruct 指针分配了空间,但是分配可以在以后增长,这样你就可以在一个数组中有许多这样的指针,其大小由 str_size< 描述 变量。

这不是初始化数组(或结构),因此 { ... } 必须不存在。

我还会注意到,出于对您代码的尊重,我保留了 str 前缀,但大多数人希望 str 指的是“字符串”,而不是“结构”(想想 strlen() 等)。所以你可能不应该使用 str 作为前缀。 (而且,在我看来,成年程序员也不使用“我的”作为前缀。然而,并不是每个人都同意我的观点——见证“MySQL”和“我的文档”,尽管在后一种情况下,有人可能会争辩说我们“无论如何,我们都被当作 child 对待。)

关于c - 错误 : variable-sized object may not be initialized| (C language),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com