C语言中的Malloc内存消耗行为

C语言中的Malloc内存消耗行为,c,malloc,C,Malloc,我写这个程序是为了了解内存消耗模式 #include <stdio.h> #include <stdlib.h> int main() { int i=0; while(1 < 2) { int *str = (int *) malloc(100000000); if(str == NULL) { printf("Out of memory.. %d", i); return(1); } printf

我写这个程序是为了了解内存消耗模式

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

int main()
{
   int i=0;

   while(1 < 2) {
   int *str = (int *) malloc(100000000);

   if(str == NULL) {
      printf("Out of memory.. %d", i);
      return(1);
   }
   printf("Attempt Count = %d\n", i++);

   }

   return(0);
}
#包括
#包括
int main()
{
int i=0;
而(1<2){
int*str=(int*)malloc(100000000);
如果(str==NULL){
printf(“内存不足..%d”,i);
申报表(1);
}
printf(“尝试计数=%d\n”,i++);
}
返回(0);
}
在我的系统中,我有8GB的ram。每个malloc调用都将尝试存储100MB。所以我希望我的程序会在(10*8)个循环中崩溃。但是柜台的数量远远超过了60万。我无法推理出同样的道理。请帮忙


即使考虑到所有交换空间和所有,它的增加也不应该超过16GB,这在这里看起来是不可能的。

在现代操作系统中,进程使用的内存是虚拟内存,它不受物理RAM大小的限制。它使用磁盘上的交换空间来支持比RAM大得多的进程


此外,一些操作系统允许过度使用。您可以分配比交换空间中实际可用的虚拟内存更多的虚拟内存。只有当其中一个进程实际试图使用过多内存时,才会出现故障。

这是因为在Linux中,由于没有初始化内存,所以还没有使用
malloc
'd内存

您可以
malloc
超过您拥有的内存(物理+虚拟),因为内核会延迟内存的分配,直到您实际使用它。我相信这会增加你的程序不因内存限制而失败的几率,但这不是问题所在

calloc
malloc
相同,但零初始化内存。当您向Linux请求一页内存时,Linux已经将其初始化为零。因此,如果
calloc
可以判断出它请求的内存是从内核请求的,那么它实际上不必为零初始化它!因为它没有,所以无法访问该内存,因此它应该能够请求比实际内存更多的内存

检查答案。它提供了一个很好的解释


此外,程序不会仅通过
malloc
”崩溃,当空间不足时,它会返回
NULL

,这取决于malloc()的实现。在Linux上,malloc overmits.specify操作系统system@hmjd对我使用了
calloc
,但仍然看到相同的结果。