为什么允许声明一个大小取决于用户输入的自动数组?

时间:2018-08-29 12:42:23

标签: c++ arrays stack variable-length-array

我正在使用MinGW为C ++ 11编译,但发现这不会引发错误:

int S;
cin>>S;
char array[S];

虽然这样做(““数组”的存储大小未知”):

char array[];

对我来说,在第一种情况下,大小也是未知的,这取决于用户输入的内容。

据我所知,自动数组是在编译时在堆栈内存中分配的。那么第一个示例为什么不会失败?

3 个答案:

答案 0 :(得分:20)

您显然不知道GNU GCC扩展Arrays of Variable Length。因此,您的第一个代码将进行编译。

错误消息有所不同。您必须指定数组长度。

gcc具有-pedantic开关-启用此开关,编译器将报告您的第一个代码无效:

  

警告:ISO C ++禁止使用可变长度数组“ array”

也请阅读此线程What is the purpose of using -pedantic in GCC/G++ compiler?

请非常小心地使用编译器扩展,因为如果您将代码移植到另一个编译器,则会遇到很大麻烦。

答案 1 :(得分:19)

不是 。 C ++没有variable-length arrays,尽管有些编译器允许它作为语言的扩展

答案 2 :(得分:3)

[这回答了询问静态数组的问题的原始版本;重复数据删除器纠正了这种误解,但现在的问题缺少一部分。]

如果您认为这段代码定义了一个静态数组是正确的,那么您确实会出于一个很好的理由而感到疑惑:在编译时确定的某些内容,例如具有静态存储持续时间的数据,显然不能依赖运行时的用户输入。这种不言而喻的行为独立于任何特定的语言。

相反,在代码段中定义的数组具有自动存储持续时间,在堆栈上创建了vulgo。一个完整的最小工作示例将使情况更清楚:它将表明代码在函数中。

可以在运行时根据需要创建具有自动存储期限的对象;没有任何逻辑上的问题可以防止这种情况的发生,这应该可以解决一般的头痛问题;-)。

但是请注意,正如一些程序员正确地指出的那样,标准C ++仍然不允许定义其大小在编译时未知的数组。自C99以来,标准C就可以了。 C ++的基本原理是,该修正案是,C ++为用例提供了更好的方法,例如矢量模板。 Mincc中使用的编译器gcc允许将其作为扩展名(为什么不可以-仍然在编译器中可用)。