Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我应该信任哪个编译器?_C_Arrays_Visual Studio_Gcc_Variable Length Array - Fatal编程技术网

C 我应该信任哪个编译器?

C 我应该信任哪个编译器?,c,arrays,visual-studio,gcc,variable-length-array,C,Arrays,Visual Studio,Gcc,Variable Length Array,这将是一个什么样的新手问题,但我试图用C语言(不是C++)做一个小练习,我遇到了一些问题 假设我想在一个方法中使用一个数组,其大小取决于一个参数: void someFunc(int arSize) { char charArray[arSize]; // DO STUFF ... } 当我尝试在Visual Studio 2013中将其编译为.c文件时,我收到一个错误,指出不允许使用非常量数组大小。然而,相同的代码在GNU编译器下的代码块中工作。我应该相信哪一个?编译

这将是一个什么样的新手问题,但我试图用C语言(不是C++)做一个小练习,我遇到了一些问题

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

void someFunc(int arSize)
{
    char charArray[arSize];
    // DO STUFF
    ...
}
当我尝试在Visual Studio 2013中将其编译为
.c
文件时,我收到一个错误,指出不允许使用非常量数组大小。然而,相同的代码在GNU编译器下的代码块中工作。我应该相信哪一个?编译器的行为如此不同,这正常吗?我一直认为,如果你正在做一些编译器不喜欢的事情,你首先不应该做,因为这不是一个标准

任何输入都是有用的!我有Python的背景,我正试图更多地参与数据结构和算法的编程

我的平台是Windows,你可能知道。在回答此问题之前,请告知我是否需要更多信息。

可变长度阵列(VLA)是C99的一项功能,Visual Studio提供了该功能,我不确定它当前是否在最新版本中支持VLA。另一方面,gcc支持C99。GCC支持,即使在C++中。 从
6.7.5.2节
阵列声明器第4段:

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


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

您想要的特性被称为(VLA),并被引入到标准中

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


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

这是一个对您起作用的过程。

您应该信任您正在使用和希望支持的编译器


关于这个问题:非常量数组大小在C99中是有效的,它不完全受
gcc
或MSVC(Microsoft的C/C++编译器)支持<但是,code>gcc甚至在C99模式之外也实现了标准中的这一功能,而MSVC没有。

实际上没有。正如您链接的GCC文档所述,它是一个C99特性(它确实得到了GCC的支持,即使是在比C99更旧的模式下作为扩展)。在1999年ISO C标准出台之前,它是gcc的扩展;然后,它成为C语言的标准特性。(如果您使用
-std=c90
编译,可以说它仍然是一个gcc扩展,但这是不确定的。)gcc也不完全支持C99。它只支持比MSVC更多的功能。@RenanGemignani正确,仍在更新中。谢谢你简洁的回复。我还遇到了一些问题,比如Visual Studio编译器告诉我不允许使用strcpy,为了安全起见,我应该尝试使用strcpy_。如果这是C99和非C99之间的部分区别,您是否有可能详细说明?另外,如果我想用旧的标准在C中做类似的操作,我会被迫声明一个任意长的数组来满足我的所有需求吗?@Bааааааааааааабаабаааааааааа;该表中的大多数“缺失”功能实际上不是必需的。它不再是一个真正的扩展。
gcc完全支持c99可变长度数组
请参见
注意,使用超大VLA可能是一个坏习惯
使用超大VLA的程序会崩溃。