FengYue20 发表于 2022-5-13 16:24:06

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

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

风车呼呼呼 发表于 2022-5-13 17:03:47

内存泄漏。你这temp指针作为静态变量,指向申请的那片内存空间,递归一层后又指向新申请的空间,之前的内存空间不就直接丢了,还怎么free

lhgzbxhz 发表于 2022-5-14 18:06:05

linux系统在进程占用内存过多的情况下就会kill掉它,所以你这样是不行的。
可以这样试试:打开一个文件,每申请一次就往里面写下本次申请的内存数量,然后flush防止数据丢失,进程被kill掉后再用文件中的数据算出可申请的内存。
页: [1]
查看完整版本: 关于动态申请内存问题:malloc