4

这将是一个新手问题,但我试图用C语言(不是C++)进行一个小练习,但遇到了一些问题。

假设我想在一个大小取决于参数之一的方法中使用一个数组:

void someFunc(int arSize)
{
    char charArray[arSize];
    // DO STUFF
    ...
}

当我尝试在Visual Studio 2013.c中将其编译为文件时,我收到一条错误消息,指出不允许使用非常量数组大小。然而,相同的代码在GNU 编译器下的CodeBlocks中工作。我应该相信哪个?编译器的行为如此不同是正常的吗?我一直认为,如果您正在做编译器不喜欢的事情,那么您一开始就不应该这样做,因为它不是标准。

任何输入都是有用的!我来自Python的背景,我正在尝试更多地参与使用数据结构和算法进行编程。

我的平台是 Windows,你可能知道。如果这个问题需要更多信息才能回答,请告诉我。

4

4 回答 4

9

可变长度数组 ( VLA ) 是C99功能,Visual Studio直到最近支持 C99,我不确定它当前是否支持最新版本的 VLA。另一方面,gcc 确实支持 C99,尽管不完全支持。gcc 支持VLA 作为 C99 模式之外的扩展,即使在C++中也是如此。

草案 C99 标准部分6.7.5.2 数组声明器第 4 段

[...] 如果大小是整数常量表达式并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型是可变长度数组类型。

于 2013-08-29T21:40:53.710 回答
3

您应该信任您正在使用并且想要支持的编译器。

gcc在那个特定问题上:非常量数组大小在 C99 中有效, MSVC 或 MSVC(Microsoft 的 C/C++ 编译器)都不完全支持。gcc但是,即使在 C99 模式之外也实现了标准中的此功能,而 MSVC 没有。

于 2013-08-29T21:44:05.677 回答
3

这取决于您的 C 编译器遵循的特定标准。

您想要的功能称为可变长度数组(VLA),并已被引入C99标准。

也许您的 Visual Studio 支持该标准的某些早期版本。也许您可以将其配置为支持更高版本。

请注意,使用大尺寸的 VLA 可能是一个坏习惯:VLA 通常是堆栈分配的,调用帧堆栈通常应该具有较小的尺寸(在当前处理器上最多几千字节),特别是对于内核代码或递归或多线程函数。calloc如果它有超过一千个单词,您可能想要堆分配(例如)您的数组。然后你free以后需要它。

于 2013-08-29T21:41:57.580 回答
0

这是作用于您的GCC 扩展。

于 2013-08-29T21:42:37.943 回答