1

我正在尝试从命令行参数中获取某个值。然后使用这个值,我将在我的结构中设置一个整数数组的大小。

我的代码:

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];
    }; 

它给了我“可变长度数组的无效声明”的错误。

我不明白为什么它不起作用,因为在通过 atoi() 从字符串转换后 size_of_heap 现在应该是一个整数,所以 block_size[size_of_heap] 应该与具有 block_size[any number] 相同。

提前致谢

4

4 回答 4

4

可变长度数组是在 C99 中引入的。如果您不能使用支持 ANSI C 以外标准的编译器,请声明您的结构,如下所示:

struct s_status {
    int *block_size;
    char *status;
}

malloc()用于在运行时为结构成员分配内存。

于 2012-11-11T19:34:21.870 回答
2

您正在使用不允许可变长度数组大小的 C 标准(或编译器)。它必须是一个常量,否则您应该使用创建block_sizeandstatus数组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
于 2012-11-11T19:31:04.173 回答
2

它不起作用,因为编译器不知道您的数组将具有的大小(size_of_heap仅在运行时才知道)。

您应该在运行时分配必要的内存,请参阅malloc().

于 2012-11-11T19:32:14.127 回答
2

你在使用 GCC 吗?如果是,您可以使用 GCC 的-std=c99or-std=gnu99选项在 C99 模式下编译它。默认情况下,GCC 只支持旧的 C89 标准,不支持变长自动数组。如果您使用的是其他编译器,请查看其文档以了解如何使其支持 C99 而不是 C89。

“新”(现在已经是旧的)C99 标准已经存在 13 年了。尽可能使用它是个好主意。

于 2012-11-11T19:34:20.680 回答