我正在使用MinGW为C ++ 11编译,但发现这不会引发错误:
int S;
cin>>S;
char array[S];
虽然这样做(““数组”的存储大小未知”):
char array[];
对我来说,在第一种情况下,大小也是未知的,这取决于用户输入的内容。
据我所知,自动数组是在编译时在堆栈内存中分配的。那么第一个示例为什么不会失败?
答案 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允许将其作为扩展名(为什么不可以-仍然在编译器中可用)。