C:如何使数组的大小动态化?

时间:2014-11-03 01:00:57

标签: c arrays visual-studio-2013 c99 c11

我从书中读到:«C Primer Plus»告诉我在C99标准中,可以使用如下的语法:

    int b=4;
    char a[b];

但是当我把这段代码放到vs2013中时,它告诉我“表达式必须有一个常量值”。

这本书错了吗?或者有一些我不知道的关于vs2013的新功能?

2 个答案:

答案 0 :(得分:7)

这叫做Variable Length Arrays,我想你的VS2013编译器不支持它们。

我建议你切换到另一个编译器。最新版本的GCCClang/LLVM支持VLA,它们支持C99甚至大多数C11

实际上我甚至建议将您的开发工作和系统切换到Linux。然后,开发工具通常是free software,作为整个系统。

否则,使用指针,例如从malloc(3)(或calloc)获得;但是,您应该针对失败测试分配,然后调用free。避免使用memory leaks(如果可用,请使用valgrind之类的工具)。也许您的编译器支持非标准但广泛可用的alloca(3)。考虑也许也可以使用程序范围 garbage collector Boehm's convervative GC,然后使用GC_malloc而不是malloc但是你赢了&# 39; t需要拨打GC_free

答案 1 :(得分:-1)

VS2013不支持变长声明。

声明数组时,不能在括号之间输入非常数值:

char a[b];

由于您从用户那里获得了大小,编译器无法提前告知char array a需要多少内存。这里最简单的事情(特别是练习)是选择一个相对较大的值并使其成为常量分配,如:

char a [1024];

然后,如果你想小心(你应该),你可以检查是否(b> 1024)并且如果用户希望b超出预先分配的范围,则打印错误。

如果你想获得幻想,你可以定义char a[]没有预先设定的大小,比如char *a;然后你用malloc分配它:

a = (char *)malloc(sizeof(char) * b);

然后,当你完成它之后,你还必须免费char a[]

free(a);

希望它有所帮助!