鱼C论坛

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

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

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

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

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

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

  5. /*更灵活的内存管理方式
  6. ·malloc
  7. --申请动态内存空间
  8. ·free
  9. --释放动态内存空间
  10. ·calloc
  11. --申请并初始化一系列内存空间
  12. ·realloc
  13. --重新分配内存空间
  14. */
  15. int main()
  16. {
  17.     int *ptr = NULL;
  18.     int num,i;

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

  21.     ptr = (int  *)malloc(num * sizeof(int));
  22.     if(ptr == NULL)
  23.     {
  24.         exit(1);
  25.     }
  26.     memset(ptr,0,num * sizeof(int));
  27. /*等价于分配内存空间并初始化
  28.     ptr = (int  *)calloc(8,sizeof(int));
  29. */
  30.     for(i = 0;i < num;i++)
  31.     {
  32.         printf("请录入第%d个整数:",i+1);
  33.         scanf("%d",&ptr[i]);
  34.     }
  35.     printf("您录入的数字是:");
  36.     for(i = 0;i < num;i++)
  37.     {
  38.         printf("%d ",*(ptr+i));
  39.     }
  40.     putchar('\n');
  41.     free(ptr);


  42.     int *ptr1 = NULL;
  43.     int *ptr2 = NULL;

  44.     //第一次申请的内存空间
  45.     ptr1 = (int *)malloc(10 * sizeof(int));
  46.     if(ptr1 == NULL)
  47.     {
  48.         exit(1);
  49.     }
  50.     for(i = 0;i < 10;i++)
  51.     {
  52.         ptr1[i] = i;
  53.     }
  54.     //假设ptr1申请的内存空间不够用了。

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

  64.     //对ptr2申请的内存空间进行操作。
  65.     for(i = 10;i < 20;i++)
  66.     {
  67.         ptr2[i] = i;
  68.     }
  69.     for(i = 0 ;i < 20;i++)
  70.     {
  71.         printf("%d ",ptr2[i]);
  72.     }
  73.     free(ptr2);
  74.     putchar('\n');


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

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

  84.         ptra = (int*)realloc(ptra,count * sizeof(int));
  85.         //ptra为NULL,此时realloc相当于malloc
  86.         if(ptra == NULL)
  87.         {
  88.             exit(1);
  89.         }
  90.         ptra[count - 1] = numa;

  91.     }while(numa != -1);

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

  98.     free(ptra);

  99.     return 0;
  100. }
复制代码









运行结果:
请输入待录入整数的个数: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的第二十天
小甲鱼最新课程 -> https://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官方接口),如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 15:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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