jzzc 发表于 2020-2-27 10:47:02

关于动态内存管理的课后题

是第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;
}

人造人 发表于 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))
                              maximum += blocksize;
                        else
                              break;
                }
      }
      printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
      return 0;
}

jzzc 发表于 2020-2-27 11:13:59

人造人 发表于 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:14:34

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

                for(count = 0; ;count++)
                {
                        block = malloc(maximum + blocksize);
                        if(block)
                        {
                                maximum = maximum + blocksize;
                                free(block);
                        }
                        else
                        {
                                break;
                        }
                }

jzzc 发表于 2020-2-27 11:15:13

人造人 发表于 2020-2-27 10:58


代码在下面,嘻嘻{:10_254:}

人造人 发表于 2020-2-27 11:18:57

jzzc 发表于 2020-2-27 11:15
代码在下面,嘻嘻

block = malloc(maximum + blocksize);

free(block);

jzzc 发表于 2020-2-27 11:26:34

人造人 发表于 2020-2-27 11:18
block = malloc(maximum + blocksize);

free(block);

现在我改成了这样,运行结果怎么还是20+G,{:10_277:}

人造人 发表于 2020-2-27 12:10:46

jzzc 发表于 2020-2-27 11:26
现在我改成了这样,运行结果怎么还是20+G,

不能free,申请了立刻释放,那可以一直申请成功

jzzc 发表于 2020-2-27 13:50:51

人造人 发表于 2020-2-27 12:10
不能free,申请了立刻释放,那可以一直申请成功

嗯嗯,大大,那这样子逻辑应该没问题吧
运行后还是二十多G{:10_245:}

人造人 发表于 2020-2-27 14:19:36

jzzc 发表于 2020-2-27 13:50
嗯嗯,大大,那这样子逻辑应该没问题吧
运行后还是二十多G

都说了,不能free

人造人 发表于 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))
                              maximum += blocksize;
                        else
                              break;
                }
      }
      printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
      return 0;
}

jzzc 发表于 2020-2-28 09:34:42

人造人 发表于 2020-2-27 14:20


大大,这个代码我运行之后就卡机了,卡了半个小时也没结果,我就重启电脑了{:10_292:}

TCY 发表于 2020-2-28 09:54:35

照楼上说的去掉free段,就这样?

jzzc 发表于 2020-2-28 10:26:41

TCY 发表于 2020-2-28 09:54
照楼上说的去掉free段,就这样?

嗯嗯,对,按照 人造人 的代码一运行程序就死机了。

TCY 发表于 2020-2-28 10:29:18

那应该是申请完把内存耗尽了,在循环结束时加个free有用不?

人造人 发表于 2020-2-28 10:29:25

jzzc 发表于 2020-2-28 09:34
大大,这个代码我运行之后就卡机了,卡了半个小时也没结果,我就重启电脑了

qq: 1440332527

我在虚拟机中测试了可以

malloc在当前环境下申请到的最大空间是:1.86GB
请按任意键继续. . .

人造人 发表于 2020-2-28 10:46:59

在我这边一切正常

jzzc 发表于 2020-2-29 16:48:54

人造人 发表于 2020-2-28 10:46
在我这边一切正常

嗯嗯 ,好滴, 我换一个编译软件试一下{:10_319:}

jzzc 发表于 2020-2-29 18:28:00

在大佬的帮助下找到原因了,是虚拟内存的原因,关掉虚拟内存运行结果就正常了,再次感谢大佬{:10_279:}

琴长不过时光 发表于 2020-3-1 13:58:34

内存大小和物理地址大小不一样的物理地址是段地址*16(十进制的10) +偏移地址 所以你这个应该去看看汇编
页: [1] 2
查看完整版本: 关于动态内存管理的课后题