gpt4 book ai didi

c - C 和内存使用中的 malloc()

转载 作者:行者123 更新时间:2023-12-04 10:45:33 25 4
gpt4 key购买 nike

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

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

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

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

return 0;
}

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

2) 运行程序时,它会在达到一定数量后停止分配内存(在 Windows 7 64 位上为 ~592mb,8GB RAM 交换文件设置为系统管理)。打印的输出如果显示 0,这意味着 NULL。为什么它在达到这个阈值后停止分配内存而不耗尽系统内存和交换?

我在下面的帖子中发现有人和我尝试了同样的事情,但他们没有看到内存使用方面的任何差异,但我看到了。
Memory Leak Using malloc fails

我已经在 Linux 内核 2.6.32-5-686 上尝试了类似的结果。

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

谢谢,

最佳答案

1)通常内存是按多页分配的,所以如果你要求的大小小于一个页,malloc 将至少分配一页。

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

最后,在 Linux 中,内核不会分配任何物理内存页面,直到您实际开始使用该内存之后,因此仅调用 malloc 不会实际消耗任何物理内存,除了跟踪分配本身所需的内存之外类(class)。虽然我不确定 Windows。

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

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

如果你跑到顶端,你会得到

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


如果您将 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

关于c - C 和内存使用中的 malloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9331401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com