gpt4 book ai didi

c - 关于C动态内存分配的练习

转载 作者:行者123 更新时间:2023-11-30 17:12:21 25 4
gpt4 key购买 nike

我正在尝试做一个关于malloc和内存使用的练习。练习的文本是:内存灾难。在函数中保留一些内存,例如一次 100 kbyte。计算调用次数。这个数字总是一样的吗?我写了这个函数:

int dis_mem(n){
int *mem;
mem = malloc(n * sizeof(int));
if (mem == NULL){
return 0;
}
else
return 1;
}

经过一段时间后,我调用该函数并打印调用次数:

int i = 0;
while (dis_mem(25000)){
i++;
}
printf("number of calls %d", i);

但是如果我执行它,几秒钟后终端会写入killed。我在 ubuntu 12.04 上使用 geany。我哪里错了?

问候。

最佳答案

我知道这个练习只是为了耗尽内存,但即使如此,你也应该尽量不要泄漏内存。每次成功分配一个新 block 时,都应该将前一个 block 的地址存储到其中。因此,当你耗尽时,你有一连串的区 block 需要释放。

代码可能是:

int dis_mem(n){
void **mem;
void **last = NULL;
mem = malloc(n * sizeof(void *));
if (mem == NULL){
while (last != NULL) {
mem = *last;
free(last);
last = mem;
}
return 0;
}
else {
*mem = last;
last = mem;
return 1;
}
}

这样,C 标准库的正确实现就不会崩溃。

我可以在运行 Windows XP (MSVC 2008) 的虚拟机中对其进行测试,并且运行良好,在运行带有 CLang 3.4.1 的 FreeBSD 10.1 的虚拟机中也运行良好(并且没有优化!)。

崩溃说明

在过去,我们使用真正的终端或直接控制台,print 曾经是一个简单的无害调用。但是现在,有一些模拟器可以将它们显示的内容保存在内存中 - 在 Unix 世界中,您会发现 xterm 和 alii,在 Windows 上,有 CMD.EXE 控制台 - 如果您耗尽了所有可用内存并尝试在不先打印消息的情况下打印消息释放任何内容,模拟器很可能无法获得足够的内存来存储和处理您发送给它的内容,因此模拟器会导致程序崩溃。这就是为什么我自己的版本在打印之前释放所有内存而不会崩溃的原因。

关于c - 关于C动态内存分配的练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31625424/

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