微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GCC 如何在堆栈上创建一个数组而不由常量变量给出其大小?

如何解决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 举报,一经查实,本站将立刻删除。