我正在尝试从命令行参数中获取某个值。然后使用这个值,我将在我的struct中设置一个整数数组的大小。
我的代码:
int main( int argc, char* argv[])
{
int size_of_heap = atoi(argv[1]);
struct s_status
{
int block_size[size_of_heap];
char status[size_of_heap];
};
它给出了“无效的可变长度数组声明”的错误。
我不明白为什么它不起作用,因为size_of_heap现在应该是由atoi()从字符串转换后的整数,所以block_size [size_of_heap]应该与block_size [任意数字]相同。
提前致谢
答案 0 :(得分:4)
Variable length arrays。如果您不能使用支持ANSI C之外的标准的编译器,请将结构声明为:
struct s_status {
int *block_size;
char *status;
}
并使用malloc()
在运行时为结构成员分配内存。
答案 1 :(得分:2)
您正在使用不允许可变长度数组大小的C标准(或编译器)。它必须是常量,或者您应该使用block_size
创建status
和malloc(size_of_heap * sizeof(arr_datatype))
数组。
struct s_stats
{
int *block_size;
char *status;
};
struct s_stats my_stats;
my_stats.block_size = malloc(sizeof(int) * size_of_heap);
my_stats.status = malloc(size_of_heap); // sizeof(char) is always 1
答案 2 :(得分:2)
它不起作用,因为编译器不知道你的数组将具有的大小(size_of_heap
只会在运行时知道。)
您应该在运行时分配必要的内存,请参阅malloc()
。
答案 3 :(得分:2)
你在使用GCC吗?如果是,您可以使用GCC的-std=c99
或-std=gnu99
选项在C99模式下编译它。默认情况下,GCC仅支持旧的C89标准,该标准不支持可变长度自动数组。如果您正在使用其他编译器,请查看其文档,了解如何使其支持C99而不是C89。
“新”(现在已经很久了)C99标准已经存在了13年了。尽可能使用它是个好主意。