Sam*_*son 7 c arrays malloc static
在静态数组上使用malloc(除了NULL返回失败)有什么好处?以下程序将占用我所有的ram并且只有在取消注释循环时才开始填充交换.它没有崩溃.
...
#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;
}
Run Code Online (Sandbox Code Playgroud)
...
经过一些反复试验后,我发现上面是我的32位Intel机器上允许使用GCC 4.3的最大静态阵列.这是标准限制,编译器限制还是机器限制?显然我可以拥有我想要的那么多.这将是段错误,但只有当我要求(并尝试使用)时,malloc才会给我更多.
有没有办法确定静态数组是否实际分配并且可以安全使用?
编辑:我感兴趣的是为什么malloc用于管理堆而不是让虚拟内存系统处理它.显然,我可以将一个数组的大小调整到我认为我需要的大小的很多倍,并且虚拟内存系统只会保留ram所需的内容.如果我从未写过例如这些巨大数组的结束(或开头)那么程序就不会使用物理内存.此外,如果我可以写入每个位置,那么malloc除了在堆中递增指针或在同一进程中搜索先前的分配外,还做了什么呢?
编者注: 如果int是32位,则1 << 31
导致未定义的行为,所以我修改了要阅读的问题1u
.问题的目的是询问有关分配大型静态缓冲区的问题.
归档时间: |
|
查看次数: |
1397 次 |
最近记录: |