繁体   English   中英

为什么在编译时声明数组大小会受到限制?

[英]why is array size limited when declared at compile time?

例如我可以做

int *arr;
arr = (int *)malloc(sizeof(int) * 1048575);

但如果程序不崩溃,我就无法做到这一点:

int arr[1048575];

为什么会这样?

假设arr是一个局部变量,将其声明为数组使用(相对有限)堆栈中的 memory,而malloc()使用(相对无限)堆中的 memory。

如果您将这些分配为函数中的局部变量(这是唯一可以让指针声明紧跟malloc调用的地方),那么区别在于malloc将从堆中分配一块 ZCD69B4957F06CD818D7BF3D61 并给您它的DE291地址,同时直接做int arr[1048575]; 将尝试在堆栈上分配 memory。 堆栈的可用空间要少得多。

堆栈的大小有限,我知道有两个主要原因:

  1. 传统的命令式编程很少使用递归,因此深度递归(和大量堆栈增长)“可能”是无限递归的标志,因此是一个会杀死进程的错误。 因此,最好在进程消耗千兆字节的虚拟 memory(在 32 位架构上)之前捕获它,这将导致进程耗尽其地址空间(此时机器可能使用比实际更多的虚拟 memory RAM,因此运行速度非常慢)。
  2. 多线程程序需要多个堆栈。 因此,运行时系统需要知道堆栈永远不会超过某个界限,因此如果创建新线程,它可以在该界限之后放置另一个堆栈。

当你声明一个数组时,你就是把它放在堆栈上。

当您调用 malloc() 时,memory 将从堆中取出。

与堆相比,堆栈通常更受限制,并且通常是瞬态的(但这取决于您进入和退出声明此数组的 function 的频率。

对于这么大的(也许不是今天的标准?)memory,假设您希望阵列持续一段时间,malloc 是一个很好的做法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM