在C/C++中,当数组的维度取自用户输入时,数组分配在哪里

mbjcgjjk  于 2023-04-19  发布在  C/C++
关注(0)|答案(3)|浏览(133)

我知道在C/C++中数组应该被分配到堆栈中,因为它们是静态数据结构,所以如果我写:

int a[2];

存储2个整数所需的空间应该被分配到堆栈中。
但是,如果我们考虑维度的情况,例如,从用户输入中获取,就像下面这样:

int dim;

cout << "Tell me array's dimension: ";    
cin >> dim;

int a[dim];

这里发生了什么?我假设数组应该被分配到堆中,因为编译器没有办法提前知道我们需要存储的整数的数量,这是正确的吗?也许这与我们实现动态结构时所做的类似(例如:链表)使用malloc?这在所有语言中的处理方式都差不多吗?或者有一些值得注意的情况下,事情的处理方式不同?

gab6jxml

gab6jxml1#

这仍然是在堆栈上分配的-现在堆栈具有可变大小,因此编译器可能必须添加一些额外的代码来跟踪堆栈大小-这是完全可以的。
在C中,这是自C99以来的标准。在C++中,这是一个非标准的特定于编译器的扩展。不支持它的编译器将引发错误。
这在所有语言中的处理方式都差不多吗?还是有一些明显的情况是不同的?
不同的语言是不一样的,比如Python,或者Java,或者Lua,都没有办法写出任何可以与这个声明相媲美的东西;所有阵列都是堆分配的。

up9lanfz

up9lanfz2#

我知道在C/C中数组应该被分配到堆栈中
C和C
都没有定义“栈”
因为它们是静态数据结构
不,你也可以在动态或自动存储中拥有数组对象。
存储2个整数所需的空间应该被分配到堆栈中。
不一定。如果它们的地址从未被观察到,实现可能会选择将这些int保存在寄存器中。

szqfcxe2

szqfcxe23#

这就是所谓的VLA(可变长度数组)。它存在于C语言从C99开始。
然而在标准C中,这并不存在,但一些C编译器(例如gcc)将其作为扩展。

int dim;
cin >> dim;
int a[dim];   // VLA (variable length array)

在这种情况下,内存通常在堆栈上分配。VLA在函数退出时自动释放,不需要采取任何操作来释放它们。

一般建议

不要滥用VLA,因为VLA的存储空间通常是有限的(因为它们通常是在堆栈上分配的),并且分配比可用内存更多的内存通常不会有好结果。

相关问题