以下代码执行何种内存分配(动态或静态)?

What kind of memory allocation (dynamic or static )does the following code do?

    #include <iostream>
using namespace std;

int main() {
    int n;
    cin>>n;
    int arr[n];
    return 0;
}

数组的大小是用户在运行时输入的,但是内存是在栈上分配的。这是什么样的内存分配?静态还是动态?

在 C++ 中与可变长度数组关联的所有保留,这是堆栈中的动态分配

  • 动态,​​因为编译时大小未知
  • 并且在堆栈中而不是在堆中,因为不像 int * arr = new arr[n]; 即使这取决于编译器。相关的问题是因为在编译时大小是未知的一些其他局部变量在堆栈中的偏移量也不能静态知道

例如使用 g++ :

#include <iostream>
using namespace std;

int main() {
    int n;
    cin>>n;
    int arr[n];
    int other;
    
    cout << &n << ' ' << arr << ' ' << &other << ' ' << new int[n] << endl;
    return 0;
}

编译与执行:

pi@raspberrypi:/tmp $ g++ -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
10
0xbe9d825c 0xbe9d8230 0xbe9d8258 0xd84868
pi@raspberrypi:/tmp $ 

可见arr位于nother之间的栈中,堆被内存中的其他地方


即使像 g++ 这样的编译器允许可变长度数组,也不建议使用它们,因为 :

  • 栈的大小总是远小于堆的大小
  • 这使得对其他一些局部变量的访问更加昂贵,因为它们在堆栈中的 offset/address 需要计算而不是静态已知

这是静态内存分配,但在静态内存分配中,您不能从用户那里获取大小。为了从用户那里获取大小,您必须进行动态内存分配。