我从书中读到:«C Primer Plus»告诉我在C99标准中,可以使用如下的语法:
int b=4;
char a[b];
但是当我把这段代码放到vs2013中时,它告诉我“表达式必须有一个常量值”。
这本书错了吗?或者有一些我不知道的关于vs2013的新功能?答案 0 :(得分:7)
这叫做Variable Length Arrays,我想你的VS2013编译器不支持它们。
我建议你切换到另一个编译器。最新版本的GCC或Clang/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);
希望它有所帮助!