鱼C论坛

 找回密码
 立即注册
查看: 1714|回复: 2

关于动态申请内存问题:malloc

[复制链接]
发表于 2022-5-13 16:24:06 | 显示全部楼层 |阅读模式

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

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

x
在编程的时候想用递归去实现动态申请内存题目,使用malloc来计算能最大申请多少内存空间,但是遇到一下问题无法解决,在gcc编译后显示Killed,调试又没有发现哪里有问题自己实在无法解决,麻烦各位大佬解答一下
代码如下:
#include <stdio.h>
#include <stdlib.h>

long int Add(size_t num);

int main(void)
{
        size_t num=1024*1024;//MB
        long int size=Add(num);
        if(0 == size)
        {
                printf("程序执行失败!!!");
                exit(1);
        }
        printf("能申请最大的内存空间为:%ldByte=%fKB=%fMB=%fGB\n",\
                size,size/1024.0,size/1048576.0,size/1073741824.0);

        return 0;
}

long int Add(size_t num)
{
        //先申明一个装动态内存空间的指针,静态变量
        static int *temp=NULL;
        //再申明一个装总申请内存空间的计数,静态变量
        static long int size=0;
        //内存空间从大到小进行申请
        temp=(int *)malloc(num);
        //递归退出条件
        if(num == 0)
        {
                //将内存空间释放
                free(temp);
                return size;
        }
        if(temp == NULL)
        {
                //说明这个大内层申请失败了,递归调用小内层
                Add(num/1024);
        }
        else
        {
                //说明申请成功
                size+=num;
                Add(num);
        }

        return 0;       
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-13 17:03:47 | 显示全部楼层
内存泄漏。你这temp指针作为静态变量,指向申请的那片内存空间,递归一层后又指向新申请的空间,之前的内存空间不就直接丢了,还怎么free
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-14 18:06:05 | 显示全部楼层
linux系统在进程占用内存过多的情况下就会kill掉它,所以你这样是不行的。
可以这样试试:打开一个文件,每申请一次就往里面写下本次申请的内存数量,然后flush防止数据丢失,进程被kill掉后再用文件中的数据算出可申请的内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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