我知道在C/C++中数组应该被分配到堆栈中,因为它们是静态数据结构,所以如果我写:
int a[2];
存储2个整数所需的空间应该被分配到堆栈中。
但是,如果我们考虑维度的情况,例如,从用户输入中获取,就像下面这样:
int dim;
cout << "Tell me array's dimension: ";
cin >> dim;
int a[dim];
这里发生了什么?我假设数组应该被分配到堆中,因为编译器没有办法提前知道我们需要存储的整数的数量,这是正确的吗?也许这与我们实现动态结构时所做的类似(例如:链表)使用malloc?这在所有语言中的处理方式都差不多吗?或者有一些值得注意的情况下,事情的处理方式不同?
3条答案
按热度按时间gab6jxml1#
这仍然是在堆栈上分配的-现在堆栈具有可变大小,因此编译器可能必须添加一些额外的代码来跟踪堆栈大小-这是完全可以的。
在C中,这是自C99以来的标准。在C++中,这是一个非标准的特定于编译器的扩展。不支持它的编译器将引发错误。
这在所有语言中的处理方式都差不多吗?还是有一些明显的情况是不同的?
不同的语言是不一样的,比如Python,或者Java,或者Lua,都没有办法写出任何可以与这个声明相媲美的东西;所有阵列都是堆分配的。
up9lanfz2#
我知道在C/C中数组应该被分配到堆栈中
C和C都没有定义“栈”
因为它们是静态数据结构
不,你也可以在动态或自动存储中拥有数组对象。
存储2个整数所需的空间应该被分配到堆栈中。
不一定。如果它们的地址从未被观察到,实现可能会选择将这些
int
保存在寄存器中。szqfcxe23#
这就是所谓的VLA(可变长度数组)。它存在于C语言从C99开始。
然而在标准C中,这并不存在,但一些C编译器(例如gcc)将其作为扩展。
在这种情况下,内存通常在堆栈上分配。VLA在函数退出时自动释放,不需要采取任何操作来释放它们。
一般建议
不要滥用VLA,因为VLA的存储空间通常是有限的(因为它们通常是在堆栈上分配的),并且分配比可用内存更多的内存通常不会有好结果。