与静态数组相比,使用 malloc(除了失败时返回 NULL)有什么优势?以下程序将占用我所有的内存并仅在未注释循环时才开始填充交换。它不会崩溃。
...
#include <stdio.h>
unsigned int bigint[ 1u << 29 - 1 ];
unsigned char bigchar[ 1u << 31 - 1 ];
int main (int argc, char **argv) {
int i;
/* for (i = 0; i < 1u << 29 - 1; i++) bigint[i] = i; */
/* for (i = 0; i < 1u << 31 - 1; i++) bigchar[i] = i & 0xFF; */
getchar();
return 0;
}
...
经过反复试验,我发现上面是我的 32 位 Intel 机器上允许使用 GCC 4.3 的最大静态数组。这是标准限制、编译器限制还是机器限制?显然,我想拥有多少就拥有多少。它会出现段错误,但前提是我要求(并尝试使用)多于 malloc 无论如何都会给我。
有没有办法确定静态数组是否实际分配并安全使用?
编辑:我对为什么使用 malloc 来管理堆而不是让虚拟内存系统处理它感兴趣。显然,我可以将数组的大小设置为我认为需要的大小的许多倍,并且虚拟内存系统只会将所需的内容保存在 ram 中。如果我从不写这些巨大数组的结尾(或开头),那么程序就不会使用物理内存。此外,如果我可以写入每个位置,那么除了在堆中增加一个指针或在同一进程中搜索先前的分配之外,malloc 还能做什么?
编者注: 如果 int 是 32 位,1 << 31
则会导致未定义的行为1u
,因此我已将问题修改为 read 。该问题的目的是询问有关分配大型静态缓冲区的问题。