C中的堆大小限制

时间:2009-12-11 09:19:17

标签: c linux heap

我对C程序的程序执行布局图中的堆有疑问。

我知道所有动态分配的内存都分配在动态增长的堆中。但我想知道C程序的最大堆大小是什么?

我只是附加一个示例C程序......在这里我试图将1GB内存分配给字符串,甚至做memset ......

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    int main(int argc, char *argv[])
    {
       char *temp;
       mybuffer=malloc(1024*1024*1024*1);

       temp = memset(mybuffer,0,(1024*1024*1024*1));

       if( (mybuffer == temp) && (mybuffer != NULL))
       printf("%x - %x\n", mybuffer, &mybuffer[((1024*1024*1024*1)-1)]]);
       else
       printf("Wrong\n");

       sleep(20);
       free(mybuffer);
       return 0;
    }

如果我一次在3个实例中运行上面的程序,那么malloc应该至少在一个实例中失败[我感觉如此] ......但是malloc仍然是成功的。

如果成功,我可以知道操作系统如何处理3GB的动态分配内存。

4 个答案:

答案 0 :(得分:8)

您的计算机很可能overcomitting在RAM上,并且在您实际编写之前不使用内存。尝试在分配后写入每个块,从而强制操作系统确保将实际RAM映射到返回的地址malloc()

答案 1 :(得分:7)

来自linux malloc页面,

BUGS
       By  default,  Linux  follows  an optimistic memory allocation strategy.
       This means that when malloc() returns non-NULL there  is  no  guarantee
       that  the  memory  really  is available.  This is a really bad bug.  In
       case it turns out that the system is out of memory, one  or  more  pro‐
       cesses  will  be  killed  by the infamous OOM killer.  In case Linux is
       employed under circumstances where it would be less desirable  to  sud‐
       denly lose some randomly picked processes, and moreover the kernel ver‐
       sion is sufficiently recent, one can  switch  off  this  overcommitting
       behavior using a command like:

           # echo 2 > /proc/sys/vm/overcommit_memory

       See  also  the  kernel  Documentation  directory,  files vm/overcommit-
       accounting and sysctl/vm.txt.

答案 2 :(得分:1)

答案 3 :(得分:1)

Malloc将分配内存,但不会写入任何内存。因此,如果虚拟内存可用,那么它将成功。只有当你写一些内容时才需要将真实内存分页到页面文件。

Calloc如果内存服务正确(!)在返回之前将零写入分配的内存的每个字节,那么需要在那里分配页面。