鱼C论坛

 找回密码
 立即注册
查看: 2054|回复: 21

[已解决]关于动态内存管理的课后题

[复制链接]
发表于 2020-2-27 10:47:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
是第37节的课后题,题目要求是:自己写一个程序,计算 malloc 函数最大可以申请多少内存空间。
我自己没写出来,看了小甲鱼的代码,看懂了,但是我运行之后结果竟然是这样的,我电脑RAM一共才8G啊,这是咋回事捏,求解答!!
在我电脑上的运行结果:
result.png
这是小甲鱼的代码:
#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[i] * count);
                        if (block)
                        {
                                maximum += blocksize[i] * count;
                                free(block);
                        }
                        else
                        {
                                break;
                        }
                }
        }

        printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);

        return 0;
}

最佳答案
2020-2-28 10:46:59
在我这边一切正常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-27 10:58:22 | 显示全部楼层
#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[i]))
                                maximum += blocksize[i];
                        else
                                break;
                }
        }
        printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-27 11:13:59 | 显示全部楼层

运行了大大的代码,电脑卡死了,刚重启过来回复
看了大大的代码,有一点启发,内层循环我改成了这样:
<blockquote><span style="white-space:pre">                </span>for(count = 0; ;count++)
运行结果还是27GB左右,咋回事捏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-27 11:14:34 | 显示全部楼层
jzzc 发表于 2020-2-27 11:13
运行了大大的代码,电脑卡死了,刚重启过来回复
看了大大的代码,有一点启发,内层循环我改成 ...

                for(count = 0; ;count++)
                {
                        block = malloc(maximum + blocksize[i]);
                        if(block)
                        {
                                maximum = maximum + blocksize[i];
                                free(block);
                        }
                        else
                        {
                                break;
                        }
                }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-27 11:15:13 | 显示全部楼层

代码在下面,嘻嘻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 11:18:57 | 显示全部楼层
jzzc 发表于 2020-2-27 11:15
代码在下面,嘻嘻

block = malloc(maximum + blocksize);

free(block);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-27 11:26:34 | 显示全部楼层
人造人 发表于 2020-2-27 11:18
block = malloc(maximum + blocksize);

free(block);

code.png 现在我改成了这样,运行结果怎么还是20+G,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 12:10:46 | 显示全部楼层
jzzc 发表于 2020-2-27 11:26
现在我改成了这样,运行结果怎么还是20+G,

不能free,申请了立刻释放,那可以一直申请成功
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-27 13:50:51 | 显示全部楼层
人造人 发表于 2020-2-27 12:10
不能free,申请了立刻释放,那可以一直申请成功

嗯嗯,大大,那这样子逻辑应该没问题吧 code.png
运行后还是二十多G
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 14:19:36 | 显示全部楼层
jzzc 发表于 2020-2-27 13:50
嗯嗯,大大,那这样子逻辑应该没问题吧
运行后还是二十多G

都说了,不能free
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 14:20:09 | 显示全部楼层
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[i]))
                                maximum += blocksize[i];
                        else
                                break;
                }
        }
        printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-28 09:34:42 | 显示全部楼层

大大,这个代码我运行之后就卡机了,卡了半个小时也没结果,我就重启电脑了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-28 09:54:35 | 显示全部楼层
照楼上说的去掉free段,就这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-28 10:26:41 | 显示全部楼层
TCY 发表于 2020-2-28 09:54
照楼上说的去掉free段,就这样?

嗯嗯,对,按照 人造人 的代码一运行程序就死机了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-28 10:29:18 | 显示全部楼层
那应该是申请完把内存耗尽了,在循环结束时加个free有用不?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-28 10:29:25 | 显示全部楼层
jzzc 发表于 2020-2-28 09:34
大大,这个代码我运行之后就卡机了,卡了半个小时也没结果,我就重启电脑了

qq: 1440332527

我在虚拟机中测试了可以
malloc在当前环境下申请到的最大空间是:1.86GB
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-28 10:46:59 | 显示全部楼层    本楼为最佳答案   
在我这边一切正常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-29 16:48:54 | 显示全部楼层
人造人 发表于 2020-2-28 10:46
在我这边一切正常

嗯嗯 ,好滴, 我换一个编译软件试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-29 18:28:00 | 显示全部楼层
在大佬的帮助下找到原因了,是虚拟内存的原因,关掉虚拟内存运行结果就正常了,再次感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 13:58:34 | 显示全部楼层
内存大小和物理地址大小不一样的  物理地址是段地址*16(十进制的10) +  偏移地址 所以你这个应该去看看汇编
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 01:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表