关于动态内存管理的课后题
是第37节的课后题,题目要求是:自己写一个程序,计算 malloc 函数最大可以申请多少内存空间。我自己没写出来,看了小甲鱼的代码,看懂了,但是我运行之后结果竟然是这样的,我电脑RAM一共才8G啊,这是咋回事捏,求解答!!{:10_266:}
在我电脑上的运行结果:
这是小甲鱼的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
void *block;
int i, count;
size_t maximum = 0;
size_t blocksize[] = {1024 * 1024, 1024, 1};//1M,1K,1B
// 下面从大到小依次尝试
// 先尝试以1024 * 1024为扩大粒度去申请内存空间
// 当malloc返回NULL时,将扩大的粒度缩小为1024继续尝试
// 最终精确到1个字节的粒度扩大maximum的尺寸
for (i = 0; i < 3; i++)
{
for (count = 1; ;count++)
{
block = malloc(maximum + blocksize * count);
if (block)
{
maximum += blocksize * count;
free(block);
}
else
{
break;
}
}
}
printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, count;
size_t maximum = 0;
size_t blocksize[] = {1024 * 1024, 1024, 1};//1M,1K,1B
// 下面从大到小依次尝试
// 先尝试以1024 * 1024为扩大粒度去申请内存空间
// 当malloc返回NULL时,将扩大的粒度缩小为1024继续尝试
// 最终精确到1个字节的粒度扩大maximum的尺寸
for(i = 0; i < 3; i++)
{
for(count = 1; ; count++)
{
if(malloc(blocksize))
maximum += blocksize;
else
break;
}
}
printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
return 0;
} 人造人 发表于 2020-2-27 10:58
运行了大大的代码,电脑卡死了,刚重启过来回复{:10_282:}
看了大大的代码,有一点启发,内层循环我改成了这样:
<blockquote><span style="white-space:pre"> </span>for(count = 0; ;count++)运行结果还是27GB左右,{:10_282:}{:10_282:}{:10_282:}咋回事捏
jzzc 发表于 2020-2-27 11:13
运行了大大的代码,电脑卡死了,刚重启过来回复
看了大大的代码,有一点启发,内层循环我改成 ...
for(count = 0; ;count++)
{
block = malloc(maximum + blocksize);
if(block)
{
maximum = maximum + blocksize;
free(block);
}
else
{
break;
}
} 人造人 发表于 2020-2-27 10:58
代码在下面,嘻嘻{:10_254:} jzzc 发表于 2020-2-27 11:15
代码在下面,嘻嘻
block = malloc(maximum + blocksize);
free(block); 人造人 发表于 2020-2-27 11:18
block = malloc(maximum + blocksize);
free(block);
现在我改成了这样,运行结果怎么还是20+G,{:10_277:}
jzzc 发表于 2020-2-27 11:26
现在我改成了这样,运行结果怎么还是20+G,
不能free,申请了立刻释放,那可以一直申请成功 人造人 发表于 2020-2-27 12:10
不能free,申请了立刻释放,那可以一直申请成功
嗯嗯,大大,那这样子逻辑应该没问题吧
运行后还是二十多G{:10_245:}
jzzc 发表于 2020-2-27 13:50
嗯嗯,大大,那这样子逻辑应该没问题吧
运行后还是二十多G
都说了,不能free jzzc 发表于 2020-2-27 13:50
嗯嗯,大大,那这样子逻辑应该没问题吧
运行后还是二十多G
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, count;
size_t maximum = 0;
size_t blocksize[] = {1024 * 1024, 1024, 1};//1M,1K,1B
// 下面从大到小依次尝试
// 先尝试以1024 * 1024为扩大粒度去申请内存空间
// 当malloc返回NULL时,将扩大的粒度缩小为1024继续尝试
// 最终精确到1个字节的粒度扩大maximum的尺寸
for(i = 0; i < 3; i++)
{
for(count = 1; ; count++)
{
if(malloc(blocksize))
maximum += blocksize;
else
break;
}
}
printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
return 0;
} 人造人 发表于 2020-2-27 14:20
大大,这个代码我运行之后就卡机了,卡了半个小时也没结果,我就重启电脑了{:10_292:} 照楼上说的去掉free段,就这样? TCY 发表于 2020-2-28 09:54
照楼上说的去掉free段,就这样?
嗯嗯,对,按照 人造人 的代码一运行程序就死机了。 那应该是申请完把内存耗尽了,在循环结束时加个free有用不? jzzc 发表于 2020-2-28 09:34
大大,这个代码我运行之后就卡机了,卡了半个小时也没结果,我就重启电脑了
qq: 1440332527
我在虚拟机中测试了可以
malloc在当前环境下申请到的最大空间是:1.86GB
请按任意键继续. . . 在我这边一切正常
人造人 发表于 2020-2-28 10:46
在我这边一切正常
嗯嗯 ,好滴, 我换一个编译软件试一下{:10_319:} 在大佬的帮助下找到原因了,是虚拟内存的原因,关掉虚拟内存运行结果就正常了,再次感谢大佬{:10_279:} 内存大小和物理地址大小不一样的物理地址是段地址*16(十进制的10) +偏移地址 所以你这个应该去看看汇编
页:
[1]
2