这将是一些新手问题,但我正在尝试使用 C 语言(而不是 C ++ )进行小练习,而我正在运行陷入一些问题。
假设我想在一个方法中使用一个数组,该方法的大小取决于其中一个参数:
void someFunc(int arSize)
{
char charArray[arSize];
// DO STUFF
...
}
当我尝试在 Visual Studio 2013 中将其编译为.c
文件时,我收到一条错误消息,指出不允许使用非常量数组。但是,相同的代码在GNU编译器下的 CodeBlocks 中工作。我应该相信哪一个?编译器的行为是否正常?我一直认为,如果你正在做一些编译器不喜欢的事情,你不应该首先这样做,因为它不是标准。
任何输入都很有用!我来自 Python 中的背景,我试图更多地参与数据结构和算法的编程。
我可以说,我的平台是Windows。如果这个问题需要更多信息才能回答,请告诉我。
答案 0 :(得分:9)
可变长度数组( VLA )是 C99 功能,Visual Studio until recently执行not support C99,我不确定它是否支持VLA在最新版本中。另一方面,gcc确实支持C99 not fully。 gcc支持VLA as an extension outside of C99 mode,即使在 C ++ 。
来自draft C99 standard部分6.7.5.2
数组声明者第4段:
[...]如果size是一个整型常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型。
答案 1 :(得分:3)
这取决于您的C编译器遵循的特定标准。
您想要的功能称为variable length array(VLA),并已引入C99标准。
也许您的Visual Studio支持该标准的某些早期版本。也许您可以将其配置为支持更高版本。
请注意,使用大尺寸的VLA可能是一个坏习惯:VLA通常是堆栈分配的,并且调用帧堆栈通常应该具有较小的大小(当前处理器上最多几千字节),特别是对于内核代码或用于递归或多线程函数。如果数组有超过一千个单词,您可能希望对数组进行堆分配(例如,使用calloc
)。那么你以后需要free
。
答案 2 :(得分:3)
您应该信任您正在使用且想要支持的编译器。
在该特定问题上:非常量数组大小在C99中有效,gcc
或MSVC(Microsoft的C / C ++编译器)都不完全支持。但是,gcc
具有此功能,即使在C99模式之外也可以实现,而MSVC则没有。
答案 3 :(得分:0)
这是GCC extension对你的行为。