为什么不能在C++中使用变量作为数组大小?

3
根据我的C++教材,以下表达式:
cout << "Enter number of students\n";
cin >> number;
int score [number];

这是一个非法的表达式。我不能使用变量作为数组大小。

为什么我不能这样做?(我不是在寻找替代方案,我还没有涉及指针、向量等,但我想了解这种行为。)


5
因为C++不允许这样做。 - Code-Apprentice
1
在C语言中,int score[number];是合法的。它属于变长数组。 - chux - Reinstate Monica
3
你的推理有误,栈对象在对象文件中不占用空间。此外,ISO C99支持可变长度数组。 - Clifford
1
@Martin James 在C语言中,由于该帖子标记为C,因此int score[number];需要number * sizeof(int)字节。因此,通常在堆栈上 - 编译器很容易生成在运行时分配此空间的代码。 - chux - Reinstate Monica
2
简短回答:不被允许是因为上世纪90年代的C++标准委员会决定不支持。但是,已经有人提出C++17将会增加对此的支持。至于为什么最初没有允许它:没有真正的理由强制编译器供应商支持它,因为C++提供了更好的实现同样目标的方式。 - M.M
显示剩余8条评论
2个回答

5

变长数组在C++中是不被支持的,因为它们在ISO C90/ANSI C89标准中并未被包含。虽然C99引入了变长数组,但这与C++的设计有所偏差,在C++中使用STL容器类可以提供更灵活的多对象存储方式,因此变长数组在C++中被认为是不必要的。


2
另一方面,关于“它们在C++中可能是不必要的”,它们在C++中也可以被认为是有用的,因为我们有一个积极的提案,而且几乎没有什么是绝对必要的。 - Cheers and hth. - Alf
2
@Cheersandhth.-Alf:关于“可以争议”的事情就在于你可以辩论。我不会说“没有任何东西是绝对必要的”,编程语言中某些特定功能确实是使其成为“图灵完备”的必要条件。这个提议已经提出,但ISO委员会似乎并不急于推进。 - Clifford

0
在C++中,编译器必须在编译时知道为数组分配的内存量。但是,变量的值直到运行时才知道。这就是为什么不允许使用变量作为数组大小的原因。
如果您需要在类项目中使用数组,我建议使用const来定义允许的最大大小。稍后您将学习如何使用其他技术,例如指针和STL容器(如std::vector)。

1
实际上并没有回答问题。而且也没有提到向量。 - Neil Kirk
请注意,这是一种古老的风格,自1998年以来,最好写成std::vector<int> number; - M.M
1
@NeilKirk 从技术上讲,你是正确的,它并没有回答问题,但它提供了一个实现OP想要达到的目标的替代方案。 - M.M
2
不是我想要的。我不想要替代方案,我还没有涉及指针、向量等。我想要理解。 - Dimensions
@MattMcNabb 如果问题是“如何在C++中拥有一个动态大小的数组”,那么这可能是可以接受的。但在这种情况下,原帖显然已经意识到了限制,并且很可能知道如何避开它,这是一个“为什么”的问题。因此,我认为这个答案对于引导提问者走向最终答案的路径没有任何帮助,难以置信。 - Chris Hayes
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接