鱼C论坛

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

关于动态内存管理的问题

[复制链接]
发表于 2023-11-21 23:15:26 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

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

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

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



  39.     int *ptr1 = NULL;
  40.     int *ptr2 = NULL;

  41.     //第一次申请的内存空间
  42.     ptr1 = (int *)malloc(10 * sizeof(int));
  43.     if(ptr1 == NULL)
  44.     {
  45.         exit(1);
  46.     }
  47.     for(i = 0;i < 10;i++)
  48.     {
  49.         ptr1[i] = i;
  50.     }
  51.     for(i = 0;i < 10;i++)
  52.     {
  53.         printf("%d ",ptr1[i]);
  54.     }

  55.     //假设ptr1申请的内存空间不够用了。

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

  65.     //对ptr2申请的内存空间进行操作。

  66.     free(ptr2);

  67.     return 0;
  68. }
复制代码



运行结果:
请输入待录入整数的个数:3
请录入第1个整数:1
请录入第2个整数:2
请录入第3个整数:3
您录入的数字是:1 2 3
Process returned -1073740940 (0xC0000374)   execution time : 9.945 s
Press any key to continue.
执行完上半段程序后就意外中断了,返回值不是0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-21 23:15:49 | 显示全部楼层
在上述代码中,存在几个问题导致程序运行出现意外中断和返回值不是0的情况。

首先,对于动态内存的分配和释放,程序中使用了 malloc 和 calloc 进行内存的申请,但在释放内存时只使用了一次 free 。这导致了内存泄漏的问题,应该在程序结束前,对所有申请的内存空间进行释放。

其次,对于 memset 的使用存在问题。在代码中,使用 memset(ptr,0,8 * sizeof(int)); 对内存进行初始化,但是 8 * sizeof(int) 并不等于 num * sizeof(int) ,这导致了内存初始化的错误。应该使用 num * sizeof(int) 来进行内存初始化,或者直接使用 calloc 进行内存分配和初始化。

最后,对于 memcpy 函数的使用也存在问题。在将 ptr1 的数据拷贝到 ptr2 时,应该使用 memcpy(ptr2, ptr1, 10 * sizeof(int)); ,而不是 memcpy(ptr2, ptr1, 20 * sizeof(int)); ,因为 ptr1 只申请了10个整数的内存空间。

综上所述,需要对代码进行如下修改:
1. 在程序结束前,对所有申请的内存空间进行释放,使用 free 函数。
2. 修改 memset 的参数为 num * sizeof(int) 。
3. 修改 memcpy 的参数为 memcpy(ptr2, ptr1, 10 * sizeof(int)); 。

修改后的代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main()
  5. {
  6.     int *ptr = NULL;
  7.     int num, i;

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

  10.     ptr = (int *)malloc(num * sizeof(int));
  11.     if (ptr == NULL)
  12.     {
  13.         exit(1);
  14.     }
  15.     // 使用calloc进行内存分配和初始化
  16.     // ptr = (int *)calloc(num, sizeof(int);

  17.     for (i = 0; i < num; i++)
  18.     {
  19.         printf("请录入第%d个整数:", i + 1);
  20.         scanf("%d", &ptr[ i]);
  21.     }
  22.     printf("您录入的数字是:");
  23.     for (i = 0; i < num; i++)
  24.     {
  25.         printf("%d ", *(ptr + i));
  26.     }

  27.     free(ptr);

  28.     int *ptr1 = NULL;
  29.     int *ptr2 = NULL;

  30.     ptr1 = (int *)malloc(10 * sizeof(int));
  31.     if (ptr1 == NULL)
  32.     {
  33.         exit(1);
  34.     }
  35.     for (i = 0; i < 10; i++)
  36.     {
  37.         ptr1[ i] = i;
  38.     }
  39.     for (i = 0; i < 10; i++)
  40.     {
  41.         printf("%d ", ptr1[ i]);
  42.     }

  43.     ptr2 = (int *)malloc(20 * sizeof(int));
  44.     if (ptr2 == NULL)
  45.     {
  46.         exit(1);
  47.     }
  48.     memcpy(ptr2, ptr1, 10 * sizeof(int));
  49.     free(ptr1);

  50.     // 对ptr2申请的内存空间进行操作。

  51.     free(ptr2);

  52.     return 0;
  53. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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