鱼C论坛

 找回密码
 立即注册
查看: 1073|回复: 1

[作品展示] S1E38:动态内存管理(下)--笔记

[复制链接]
发表于 2023-11-24 14:59:40 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//鱼C论坛——BaysideLizard写于2023年11月24日

/*更灵活的内存管理方式
·malloc
--申请动态内存空间
·free
--释放动态内存空间
·calloc
--申请并初始化一系列内存空间
·realloc
--重新分配内存空间
*/
int main()
{
    int *ptr = NULL;
    int num,i;

    printf("请输入待录入整数的个数:");
    scanf("%d",&num);

    ptr = (int  *)malloc(num * sizeof(int));
    if(ptr == NULL)
    {
        exit(1);
    }
    memset(ptr,0,num * sizeof(int));
/*等价于分配内存空间并初始化
    ptr = (int  *)calloc(8,sizeof(int));
*/
    for(i = 0;i < num;i++)
    {
        printf("请录入第%d个整数:",i+1);
        scanf("%d",&ptr[i]);
    }
    printf("您录入的数字是:");
    for(i = 0;i < num;i++)
    {
        printf("%d ",*(ptr+i));
    }
    putchar('\n');
    free(ptr);


    int *ptr1 = NULL;
    int *ptr2 = NULL;

    //第一次申请的内存空间
    ptr1 = (int *)malloc(10 * sizeof(int));
    if(ptr1 == NULL)
    {
        exit(1);
    }
    for(i = 0;i < 10;i++)
    {
        ptr1[i] = i;
    }
    //假设ptr1申请的内存空间不够用了。

    //第二次申请内存空间。
    ptr2 = (int *)calloc(20,sizeof(int));
    if(ptr2 == NULL)
    {
        exit(1);
    }
    //将ptr1的数据拷贝到ptr2中。
    memcpy(ptr2,ptr1,10 * sizeof(int));
    free(ptr1);

    //对ptr2申请的内存空间进行操作。
    for(i = 10;i < 20;i++)
    {
        ptr2[i] = i;
    }
    for(i = 0 ;i < 20;i++)
    {
        printf("%d ",ptr2[i]);
    }
    free(ptr2);
    putchar('\n');


//以下程序不用malloc,用realloc实现malloc
    int numa;
    int count = 0;
    int *ptra = NULL;//注意:这里必须初始化为NULL

    do
    {
        printf("请输入一个整数(输入-1表示结束):");
        scanf("%d",&numa);
        count++;

        ptra = (int*)realloc(ptra,count * sizeof(int));
        //ptra为NULL,此时realloc相当于malloc
        if(ptra == NULL)
        {
            exit(1);
        }
        ptra[count - 1] = numa;

    }while(numa != -1);

    printf("输入的整数分别是:");
    for(i = 0;i < count;i++)
    {
        printf("%d ",ptra[i]);
    }
    putchar('\n');

    free(ptra);

    return 0;
}








运行结果:
请输入待录入整数的个数:3
请录入第1个整数:1
请录入第2个整数:3
请录入第3个整数:5
您录入的数字是:1 3 5
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
请输入一个整数(输入-1表示结束):9
请输入一个整数(输入-1表示结束):8
请输入一个整数(输入-1表示结束):7
请输入一个整数(输入-1表示结束):8
请输入一个整数(输入-1表示结束):9
请输入一个整数(输入-1表示结束):0
请输入一个整数(输入-1表示结束):1
请输入一个整数(输入-1表示结束):-1
输入的整数分别是:9 8 7 8 9 0 1 -1

Process returned 0 (0x0)   execution time : 8.075 s
Press any key to continue.











在FishC学C的第二十天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-24 15:00:33 | 显示全部楼层
这段代码主要介绍了动态内存管理的相关函数,包括malloc、free、calloc和realloc。在第一个例子中,用户输入一个整数num,并根据num的值动态分配了num个int类型的内存空间,然后通过指针ptr来访问这些内存空间并进行操作,最后释放内存。之后又给出了一个示例,展示了使用calloc和memcpy来重新分配内存空间和复制数据的过程。

在这个例子中有两个值得注意的地方:
1. 在使用malloc或者calloc函数申请内存空间后,需要检查指针是否为NULL,如果为NULL说明分配内存失败。
2. 在循环中接收用户输入的整数,并将其存储到动态分配的内存空间中时,需要使用*(ptr + i)来访问每个元素的值,而不是直接使用ptr。因为ptr代表的是指向内存空间的指针,需要通过指针偏移来访问不同位置的元素。
3. 使用完动态分配的内存空间后,应该使用free()函数来释放这块内存空间,否则会造成内存泄漏。

另外,代码中还展示了如何使用realloc函数实现malloc的功能。使用realloc函数可以重新分配之前分配的内存空间,并返回指向新分配空间的指针。在使用realloc函数时,如果传入的指针为NULL,相当于使用malloc函数;如果传入的指针不为NULL,realloc函数将尝试扩展或者缩小原有内存空间。

希望这个解答对你有帮助,如还有其他问题,欢迎提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 12:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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