【发布时间】:2015-12-01 14:55:18
【问题描述】:
所以,我有这段代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p;
long n = 1;
while(1) {
p = malloc(n * sizeof(char));
//p = calloc(n, sizeof(char));
if(p) {
printf("[%ld] Memory allocation successful! Address: %p\n", n , p);
n++;
} else {
printf("No more memory! Sorry...");
break;
}
}
free(p);
getch();
return 0;
}
我在 Windows 上运行。有趣的事:
如果我们使用 malloc,程序会分配大约 430 MB 的内存然后停止(这里的照片 => http://i.imgur.com/woswThG.png)
如果我们使用 calloc,程序会分配大约 2 GB 的内存然后停止(这里的照片 => http://i.imgur.com/3JKy5pA.png)
(奇怪的测试):如果我们同时使用它们,它最多使用 (~400MB + ~2GB) / 2 => ~1.2GB
但是,如果我在 Linux 上运行相同的代码,分配会继续进行(在 600k 分配和使用了许多 GB 之后,它仍然会继续,直到最终被杀死)并且使用的内存量大致相同。
所以我的问题是:他们不应该分配相同数量的内存吗?我认为唯一的区别是 calloc 用零初始化内存(malloc 返回未初始化的内存)。为什么它只发生在 Windows 上?它既奇怪又有趣。
希望你能帮我解释一下。谢谢!
编辑:
Code::Blocks 13.12 与 GNU GCC 编译器
Windows 10 (x64)
Linux Mint 17.2 “Rafaela” - Cinnamon(64 位)(用于 Linux 测试)
【问题讨论】:
-
分配的virtual内存和分配的physical内存之间存在差异...以及两个操作系统如何处理和显示之间的差异,例如内存分配。
-
这样的测试有什么实际用途?
-
我们在大学的编程课程中学习内存分配,我只是想看看一切是如何工作的。我写这个程序只是为了看看我的内存填得有多快(我有 8GB 内存,但在 Windows 中,这个程序使用了最大 2GB - 我注意到的另一件事)。
-
您应该更准确地了解环境:哪个编译器? 32 位还是 64 位?哪个版本的 Windows 和 Linux...
-
尝试在
malloc之后添加memset(p,0, n)。然后你应该得到与calloc版本相同的结果。calloc清除分配的内存,但malloc不会。
标签: c memory memory-management malloc calloc