C和内存使用情况中的malloc()

max*_*use 2 c memory malloc memory-leaks memory-management

我正在尝试使用malloc进行实验,以查看是否可以分配所有可用内存。

我使用了以下简单程序,并有几个问题:

int main(void)
{
    char * ptr;
    int x = 100;

    while(1)
    {
        ptr = (char *) malloc(x++ * sizeof(char) / 2);
        printf("%p\n",ptr);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

1)为什么当使用较大的数据类型(int,unsigned long long int,long double)时,该进程将使用较少的内存,而使用较小的数据类型(int,char)将使用更多的内存?

2)运行程序时,它会在达到一定数量后停止分配内存(在Windows 7 64位系统上约为592mb,并将8GB RAM交换文件设置为系统托管)。如果输出为0,则表示NULL。为什么在达到此阈值后停止分配内存,而没有耗尽系统内存并进行交换?

我在以下文章中发现有人尝试与我做相同的事情,但是区别是他们没有看到内存使用方面的任何区别,但是我同意。 使用malloc的内存泄漏失败

我已经在Linux内核2.6.32-5-686上尝试过该代码,但结果相似。

任何帮助和解释将不胜感激。

谢谢,

iab*_*der 5

1)通常,内存是在多个页面中分配的,因此,如果您要求的大小小于一个页面,则malloc将分配至少一个页面。

2)这是有道理的,因为在多任务系统中,您不是唯一的用户,并且您的进程不是唯一正在运行的进程,还有许多其他进程共享有限的资源集,包括内存。如果操作系统允许一个进程无限制地分配其所需的所有内存,那么它并不是一个好的操作系统,对吗?

最后,在Linux中,内核直到您真正开始使用该内存后才分配任何物理内存页面,因此仅调用malloc并不会实际消耗任何物理内存,除了跟踪自己的分配本身所需的内容之外课程。我不确定Windows。

编辑:下面的示例分配1GB的虚拟内存

#include <stdio.h>
int main(int agrc, char **argv)
{
    void *p = malloc(1024*1024*1024);
    getc(stdin);
}
Run Code Online (Sandbox Code Playgroud)

如果你跑得最好,你会得到

top -p `pgrep test`
PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20   0 1027m  328  252 S    0  0.0   0:00.00 test
Run Code Online (Sandbox Code Playgroud)

如果将malloc更改为calloc,然后再次运行top,则得到

top -p `pgrep test`
PR   NI VIRT  RES  SHR S %CPU %MEM    TIME+ COMMAND              
20   0  1027m 1.0g 328 S    0  1.3   0:00.08 test
Run Code Online (Sandbox Code Playgroud)