提问者:小点点

下面的代码做哪种内存分配(动态或静态)?


    #include <iostream>
using namespace std;

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

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


共2个答案

匿名用户

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

  • 动态,因为大小在编译时未知
  • 和堆栈中,而不是堆中,因为不像int*arr=newarr[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被放置在堆栈中n和other之间,堆在内存的其他位置

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

  • 堆栈的大小总是远远小于堆的大小
  • 这使得访问其他一些局部变量的开销更大,因为它们在堆栈中的偏移量/地址需要计算,而不是静态已知

匿名用户

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