如何解决GCC 如何在堆栈上创建一个数组而不由常量变量给出其大小?
这个例子是如何编译和运行的?
#include <iostream>
int main() {
int input;
std::cin >> input;
int arr[input];
return 0;
}
我的理解是,由于 input
的值在编译时未知,所以它必须是堆分配的数组。程序启动时不是为数组之类的东西(没有在堆上分配)分配的堆栈空间吗?
解决方法
我的理解是,由于在编译时不知道输入的值,所以它必须是堆分配的数组。
你的理解是正确的。
不是在程序启动的时候就为数组之类的东西(没有在堆上分配)分配了堆栈空间吗?
实际上,执行堆栈的内存通常在程序启动时分配。这不是 C++ 语言指定的内容,而是一个实现细节。
这个例子是如何编译和运行的?
程序格式错误。编译器不需要编译程序,而是需要诊断问题(如果不诊断,则编译器不符合 C++ 标准)。编译器仍然可以将程序编译为语言扩展。 C++ 语言没有规定这种情况是如何发生的。
,我的理解是,由于在编译时不知道输入的值,所以它必须是堆分配的数组。
虽然 C++ 语言规则确实说你不能这样做,但从技术角度来看调用堆栈通常是如何实现的,这实际上并不一定是真的。一般来说,是的,事先不知道大小的对象不会放在堆栈中。但是,对于局部变量是可变长度数组的情况,编译器将该数组放入堆栈空间并不难。例如,C 语言支持这一点,this older question 解决了实现它的一种方式。尽管 C++ 不允许像 C 那样使用可变长度数组(从技术上讲,这里的代码不是合法的 C++ 代码),但一些编译器允许这样做。
不是在程序启动的时候就为数组之类的东西(没有在堆上分配)分配了堆栈空间吗?
通常情况并非如此。当程序启动时,它被分配了一个内存区域并被告知“这是你的堆栈应该去的地方”,但该空间通常不受程序编写方式的任何决定,通常由操作系统控制或由编译器。然后,每当需要堆栈上的空间时——例如,因为调用了一个函数或因为进入了一个新的块作用域——程序占用了调用堆栈上的一些空间,当块作用域退出或函数返回时将其交还。
因此,程序不需要知道从哪里开始为每个函数在堆栈上保留多少空间。它可以推迟到调用实际函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。