使用命令行参数声明struct

时间:2012-11-11 19:26:57

标签: c

我正在尝试从命令行参数中获取某个值。然后使用这个值,我将在我的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 [任意数字]相同。

提前致谢

4 个答案:

答案 0 :(得分:4)

在C99中引入了

Variable length arrays。如果您不能使用支持ANSI C之外的标准的编译器,请将结构声明为:

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

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

答案 1 :(得分:2)

您正在使用不允许可变长度数组大小的C标准(或编译器)。它必须是常量,或者您应该使用block_size创建statusmalloc(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年了。尽可能使用它是个好主意。