错误:可能无法初始化可变大小的对象(C语言)

时间:2013-12-28 20:04:32

标签: c variables

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

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

我有这段代码,我收到以下错误:

error: variable-sized object may not be initialized|

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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

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

C标准说:

  

ISO / IEC 9899:2011§6.7.9初始化

     

¶3要初始化的实体的类型应为未知大小或完整的数组   不是可变长度数组类型的对象类型。

这是一个约束;没有蠕动的空间。虽然不能初始化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引用'string',而不是'结构'(想想{ {1}}等等。所以你可能不应该使用strlen()作为前缀。 (而且,在我看来,成人程序员也不会使用'my'作为前缀。但是,不是每个人都同意我 - 见证'MySQL'和'我的文档',尽管在后一种情况下,有人可能会说我们'无论如何都被视为孩子。)