我是编程的初学者,所以我对错误并不熟悉。
int integer=1;
struct myStruct **str1[integer] = malloc(sizeof(struct myStruct *));
我有这段代码,我收到以下错误:
error: variable-sized object may not be initialized|
我发现问题是由变量'整数'引起的,因为当我删除它时,我没有遇到这个错误。但我无法理解为什么我会看到它,因为我已经初始化了'整数'变量。此外,我已经初始化了“myStruct”结构并在此处初始化了str1。
有人可以帮助我吗?
答案 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'和'我的文档',尽管在后一种情况下,有人可能会说我们'无论如何都被视为孩子。)