例如我可以做
int *arr;
arr = (int *)malloc(sizeof(int) * 1048575);
但如果程序不崩溃,我就无法做到这一点:
int arr[1048575];
为什么会这样?
例如我可以做
int *arr;
arr = (int *)malloc(sizeof(int) * 1048575);
但如果程序不崩溃,我就无法做到这一点:
int arr[1048575];
为什么会这样?
假设arr
是一个局部变量,将其声明为数组使用(相对有限)堆栈中malloc()
的内存,而使用(相对无限)堆中的内存。
如果您将这些分配为函数中的局部变量(这是唯一可以在malloc
调用后立即声明指针的地方),那么不同之处在于malloc
将从堆中分配一块内存并为您提供它的地址,而直接做int arr[1048575];
将尝试在堆栈上分配内存。堆栈的可用空间要少得多。
堆栈的大小有限,我知道有两个主要原因:
当你声明一个数组时,你就是把它放在堆栈上。
当你调用 malloc() 时,内存是从堆中取出的。
与堆相比,堆栈通常更受限制,并且通常是瞬态的(但这取决于您进入和退出声明此数组的函数的频率。
对于这么大的内存(也许不是今天的标准?),最好是 malloc 内存,假设您希望数组持续一段时间。