鱼C论坛

 找回密码
 立即注册
查看: 237|回复: 5

[已解决]指针数组释放空间报错

[复制链接]
发表于 2025-1-27 21:46:03 | 显示全部楼层 |阅读模式

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

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

x
  1. #define _CRT_SECURE_NO_WARNINGS

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. // Kadane算法
  5. // 找到以M = a[i]为结尾的序列和最大值
  6. // 将x = a[i + 1]和之前的最大值求和
  7. // 则以x为结尾的最大和序列:[M, x]或[x]

  8. int Get_max_sum_array(int a[], int size, int *pbegin, int *pend)
  9. {
  10.         int max_sum = a[0];
  11.         int sum = a[0];
  12.         int begin = 0;
  13.         int end = 0;

  14.         for (int i = 1; i < size; i++) // end就是当前元素
  15.         {
  16.                 if (a[i] + sum >= a[i]) // 继续
  17.                 {
  18.                         sum += a[i];
  19.                 }
  20.                 else // 更新起点
  21.                 {
  22.                         begin = i;
  23.                         sum = a[i];
  24.                 }

  25.                 end = i;

  26.                 if (sum > max_sum) // 更新最大
  27.                 {
  28.                         max_sum = sum;

  29.                         *pbegin = begin;
  30.                         *pend = end;
  31.                 }
  32.         }

  33.         return max_sum;
  34. }

  35. // 找出和最大的子序列
  36. int main()
  37. {
  38.         int lines = 0;
  39.         scanf("%d", &lines);

  40.         // 为结果申请空间
  41.         int** presult = (int**)malloc(sizeof(int*) * lines);
  42.         for (int i = 0; i < lines; i++)
  43.         {
  44.                 *(presult + i) = (int*)malloc(3 * sizeof(int));
  45.         }

  46.         int num = 0; // 读入的数字
  47.         int count = 0; // 一行的数字数量
  48.         int n = 0; // 当前处理的行数

  49.         for (int n = 0; n < lines; n++)
  50.         {
  51.                 scanf("%d", &count);

  52.                 int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间

  53.                 for (int i = 0; i < count; i++)
  54.                 {
  55.                         if (scanf("%d", &num) != EOF)
  56.                         {
  57.                                 *(pa + i) = num;
  58.                         }
  59.                 }

  60.                 // 处理数据
  61.                 int max_sum = 0;
  62.                 int begin = 0;
  63.                 int end = 0;

  64.                 max_sum = Get_max_sum_array(pa, count, &begin, &end);

  65.                 // 释放空间
  66.                 free(pa);

  67.                 // 记录结果
  68.                 *(*(presult + n) + 1) = max_sum;
  69.                 *(*(presult + n) + 2) = begin + 1;
  70.                 *(*(presult + n) + 3) = end + 1;
  71.         }

  72.         // 统一输出结果
  73.         for (int i = 0; i < lines; i++)
  74.         {
  75.                 printf("Case %d:\n", i + 1);
  76.                 printf("%d %d %d\n", *(*(presult + i) + 1), *(*(presult + i) + 2), *(*(presult + i) + 3));

  77.                 if (i != lines - 1)
  78.                 {
  79.                         putchar('\n');
  80.                 }
  81.         }

  82.         for (int i = 0; i < lines; i++)
  83.         {
  84.                 int* p = *(presult + i);
  85.                 free(p);
  86.         }

  87.         return 0;
  88. }
复制代码

C:\Users\user_xk\Desktop
指针数组presult的空间释放不是遍历释放每一个指针,再释放自身吗
但是,当我把中间代码删除后,又没有报错了,感觉很奇怪
  1. int main()
  2. {
  3.         int lines = 0;
  4.         scanf("%d", &lines);

  5.         // 为结果申请空间
  6.         int** presult = (int**)malloc(sizeof(int*) * lines);
  7.         for (int i = 0; i < lines; i++)
  8.         {
  9.                 *(presult + i) = (int*)malloc(3 * sizeof(int));
  10.         }


  11.         for (int i = 0; i < lines; i++)
  12.         {
  13.                 int* p = *(presult + i);
  14.                 free(p);
  15.         }

  16.         free(presult);

  17.         return 0;
  18. }
复制代码
最佳答案
2025-1-27 21:46:15
你代码中有几个地方需要修改和注意。首先,让我们来解决你遇到的问题。

1. 在 `Get_max_sum_array` 函数中的参数应该是数组 `int *a` 而不是单个整数。
2. 记录结果时,你使用的是索引从1开始,而数组索引应从0开始。
3. 最后,你没有释放 `presult` 整体的空间。

以下是修正后的代码:

  1. #define _CRT_SECURE_NO_WARNINGS

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. // Kadane算法
  5. // 找到以M为结尾的序列和最大值
  6. int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
  7. {
  8.     int max_sum = a[0];
  9.     int sum = a[0];
  10.     int begin = 0;
  11.     int end = 0;

  12.     for (int i = 1; i < size; i++)
  13.     {
  14.         if (sum >= 0)
  15.         {
  16.             sum += a[i];
  17.         }
  18.         else
  19.         {
  20.             begin = i;
  21.             sum = a[i];
  22.         }

  23.         end = i;

  24.         if (sum > max_sum)
  25.         {
  26.             max_sum = sum;
  27.             *pbegin = begin;
  28.             *pend = end;
  29.         }
  30.     }

  31.     return max_sum;
  32. }

  33. // 找出和最大的子序列
  34. int main()
  35. {
  36.     int lines = 0;
  37.     scanf("%d", &lines);

  38.     // 为结果申请空间
  39.     int** presult = (int**)malloc(sizeof(int*) * lines);
  40.     for (int i = 0; i < lines; i++)
  41.     {
  42.         presult[i] = (int*)malloc(3 * sizeof(int));
  43.     }

  44.     int num = 0; // 读入的数字
  45.     int count = 0; // 一行的数字数量

  46.     for (int n = 0; n < lines; n++)
  47.     {
  48.         scanf("%d", &count);

  49.         int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间

  50.         for (int i = 0; i < count; i++)
  51.         {
  52.             if (scanf("%d", &num) != EOF)
  53.             {
  54.                 pa[i] = num;
  55.             }
  56.         }

  57.         // 处理数据
  58.         int max_sum = 0;
  59.         int begin = 0;
  60.         int end = 0;

  61.         max_sum = Get_max_sum_array(pa, count, &begin, &end);

  62.         // 记录结果
  63.         presult[n][0] = max_sum;
  64.         presult[n][1] = begin + 1;
  65.         presult[n][2] = end + 1;

  66.         // 释放空间
  67.         free(pa);
  68.     }

  69.     // 统一输出结果
  70.     for (int i = 0; i < lines; i++)
  71.     {
  72.         printf("Case %d:\n", i + 1);
  73.         printf("%d %d %d\n", presult[i][0], presult[i][1], presult[i][2]);

  74.         if (i != lines - 1)
  75.         {
  76.             putchar('\n');
  77.         }
  78.     }

  79.     for (int i = 0; i < lines; i++)
  80.     {
  81.         free(presult[i]);
  82.     }
  83.     free(presult);

  84.     return 0;
  85. }
复制代码


此代码修正了原代码中的问题并确保正确释放内存。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-1-27 21:46:15 | 显示全部楼层    本楼为最佳答案   
你代码中有几个地方需要修改和注意。首先,让我们来解决你遇到的问题。

1. 在 `Get_max_sum_array` 函数中的参数应该是数组 `int *a` 而不是单个整数。
2. 记录结果时,你使用的是索引从1开始,而数组索引应从0开始。
3. 最后,你没有释放 `presult` 整体的空间。

以下是修正后的代码:

  1. #define _CRT_SECURE_NO_WARNINGS

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. // Kadane算法
  5. // 找到以M为结尾的序列和最大值
  6. int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
  7. {
  8.     int max_sum = a[0];
  9.     int sum = a[0];
  10.     int begin = 0;
  11.     int end = 0;

  12.     for (int i = 1; i < size; i++)
  13.     {
  14.         if (sum >= 0)
  15.         {
  16.             sum += a[i];
  17.         }
  18.         else
  19.         {
  20.             begin = i;
  21.             sum = a[i];
  22.         }

  23.         end = i;

  24.         if (sum > max_sum)
  25.         {
  26.             max_sum = sum;
  27.             *pbegin = begin;
  28.             *pend = end;
  29.         }
  30.     }

  31.     return max_sum;
  32. }

  33. // 找出和最大的子序列
  34. int main()
  35. {
  36.     int lines = 0;
  37.     scanf("%d", &lines);

  38.     // 为结果申请空间
  39.     int** presult = (int**)malloc(sizeof(int*) * lines);
  40.     for (int i = 0; i < lines; i++)
  41.     {
  42.         presult[i] = (int*)malloc(3 * sizeof(int));
  43.     }

  44.     int num = 0; // 读入的数字
  45.     int count = 0; // 一行的数字数量

  46.     for (int n = 0; n < lines; n++)
  47.     {
  48.         scanf("%d", &count);

  49.         int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间

  50.         for (int i = 0; i < count; i++)
  51.         {
  52.             if (scanf("%d", &num) != EOF)
  53.             {
  54.                 pa[i] = num;
  55.             }
  56.         }

  57.         // 处理数据
  58.         int max_sum = 0;
  59.         int begin = 0;
  60.         int end = 0;

  61.         max_sum = Get_max_sum_array(pa, count, &begin, &end);

  62.         // 记录结果
  63.         presult[n][0] = max_sum;
  64.         presult[n][1] = begin + 1;
  65.         presult[n][2] = end + 1;

  66.         // 释放空间
  67.         free(pa);
  68.     }

  69.     // 统一输出结果
  70.     for (int i = 0; i < lines; i++)
  71.     {
  72.         printf("Case %d:\n", i + 1);
  73.         printf("%d %d %d\n", presult[i][0], presult[i][1], presult[i][2]);

  74.         if (i != lines - 1)
  75.         {
  76.             putchar('\n');
  77.         }
  78.     }

  79.     for (int i = 0; i < lines; i++)
  80.     {
  81.         free(presult[i]);
  82.     }
  83.     free(presult);

  84.     return 0;
  85. }
复制代码


此代码修正了原代码中的问题并确保正确释放内存。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2025-1-27 21:46:39 | 显示全部楼层
(VQZK$%`1~)2_H`6DK(P}EB.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-27 21:46:57 | 显示全部楼层


看起来你提供了一些代码片段,我将其格式化为BBCode并且尝试确保所有问题都被修正。

修正后的代码


  1. #define _CRT_SECURE_NO_WARNINGS

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. // Kadane算法
  5. // 找到以M为结尾的序列和最大值
  6. int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
  7. {
  8.     int max_sum = a[0];
  9.     int sum = a[0];
  10.     int begin = 0;
  11.     int end = 0;

  12.     for (int i = 1; i < size; i++)
  13.     {
  14.         if (sum >= 0)
  15.         {
  16.             sum += a[i];
  17.         }
  18.         else
  19.         {
  20.             begin = i;
  21.             sum = a[i];
  22.         }

  23.         end = i;

  24.         if (sum > max_sum)
  25.         {
  26.             max_sum = sum;
  27.             *pbegin = begin;
  28.             *pend = end;
  29.         }
  30.     }

  31.     return max_sum;
  32. }

  33. // 找出和最大的子序列
  34. int main()
  35. {
  36.     int lines = 0;
  37.     scanf("%d", &lines);

  38.     // 为结果申请空间
  39.     int** presult = (int**)malloc(sizeof(int*) * lines);
  40.     for (int i = 0; i < lines; i++)
  41.     {
  42.         presult[i] = (int*)malloc(3 * sizeof(int));
  43.     }

  44.     int num = 0; // 读入的数字
  45.     int count = 0; // 一行的数字数量

  46.     for (int n = 0; n < lines; n++)
  47.     {
  48.         scanf("%d", &count);

  49.         int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间

  50.         for (int i = 0; i < count; i++)
  51.         {
  52.             if (scanf("%d", &num) != EOF)
  53.             {
  54.                 pa[i] = num;
  55.             }
  56.         }

  57.         // 处理数据
  58.         int max_sum = 0;
  59.         int begin = 0;
  60.         int end = 0;

  61.         max_sum = Get_max_sum_array(pa, count, &begin, &end);

  62.         // 记录结果
  63.         presult[n][0] = max_sum;
  64.         presult[n][1] = begin + 1;
  65.         presult[n][2] = end + 1;

  66.         // 释放空间
  67.         free(pa);
  68.     }

  69.     // 统一输出结果
  70.     for (int i = 0; i < lines; i++)
  71.     {
  72.         printf("Case %d:\n", i + 1);
  73.         printf("%d %d %d\n", presult[i][0], presult[i][1], presult[i][2]);

  74.         if (i != lines - 1)
  75.         {
  76.             putchar('\n');
  77.         }
  78.     }

  79.     for (int i = 0; i < lines; i++)
  80.     {
  81.         free(presult[i]);
  82.     }
  83.     free(presult);

  84.     return 0;
  85. }
复制代码


希望这些修改可以解决你遇到的问题。如果你还有更多问题或需要进一步的帮助,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-27 21:48:46 | 显示全部楼层
原题: PILRA6L%OKGB{QWH6V@.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-27 21:49:23 | 显示全部楼层


好的,让我们解决原来问题中的内存释放错误。你的代码中存在一些内存管理的问题,以及参数传递的一些问题。下面是修正后的代码:

  1. #define _CRT_SECURE_NO_WARNINGS

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. // Kadane算法
  5. // 找到以a[]结尾的序列和最大值
  6. int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
  7. {
  8.     int max_sum = a[0];
  9.     int sum = a[0];
  10.     int begin = 0;
  11.     int end = 0;

  12.     for (int i = 1; i < size; i++)
  13.     {
  14.         if (sum >= 0)
  15.         {
  16.             sum += a[i];
  17.         }
  18.         else
  19.         {
  20.             begin = i;
  21.             sum = a[i];
  22.         }

  23.         end = i;

  24.         if (sum > max_sum)
  25.         {
  26.             max_sum = sum;
  27.             *pbegin = begin;
  28.             *pend = end;
  29.         }
  30.     }

  31.     return max_sum;
  32. }

  33. // 找出和最大的子序列
  34. int main()
  35. {
  36.     int lines = 0;
  37.     scanf("%d", &lines);

  38.     // 为结果申请空间
  39.     int** presult = (int**)malloc(sizeof(int*) * lines);
  40.     for (int i = 0; i < lines; i++)
  41.     {
  42.         presult[i] = (int*)malloc(3 * sizeof(int));
  43.     }

  44.     int num = 0; // 读入的数字
  45.     int count = 0; // 一行的数字数量
  46.     int n = 0; // 当前处理的行数

  47.     for (n = 0; n < lines; n++)
  48.     {
  49.         scanf("%d", &count);

  50.         int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间

  51.         for (int i = 0; i < count; i++)
  52.         {
  53.             if (scanf("%d", &num) != EOF)
  54.             {
  55.                 pa[i] = num;
  56.             }
  57.         }

  58.         // 处理数据
  59.         int max_sum = 0;
  60.         int begin = 0;
  61.         int end = 0;

  62.         max_sum = Get_max_sum_array(pa, count, &begin, &end);

  63.         // 记录结果
  64.         presult[n][0] = max_sum;
  65.         presult[n][1] = begin + 1;
  66.         presult[n][2] = end + 1;

  67.         // 释放空间
  68.         free(pa);
  69.     }

  70.     // 统一输出结果
  71.     for (int i = 0; i < lines; i++)
  72.     {
  73.         printf("Case %d:\n", i + 1);
  74.         printf("%d %d %d\n", presult[i][0], presult[i][1], presult[i][2]);

  75.         if (i != lines - 1)
  76.         {
  77.             putchar('\n');
  78.         }
  79.     }

  80.     for (int i = 0; i < lines; i++)
  81.     {
  82.         free(presult[i]);
  83.     }
  84.     free(presult);

  85.     return 0;
  86. }
复制代码

确保你将这段代码放在
  1. ...
复制代码
标签内,以便在Discuz!论坛上正确显示格式:


  1. #define _CRT_SECURE_NO_WARNINGS

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. // Kadane算法
  5. // 找到以a[]结尾的序列和最大值
  6. int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
  7. {
  8.     int max_sum = a[0];
  9.     int sum = a[0];
  10.     int begin = 0;
  11.     int end = 0;

  12.     for (int i = 1; i < size; i++)
  13.     {
  14.         if (sum >= 0)
  15.         {
  16.             sum += a[i];
  17.         }
  18.         else
  19.         {
  20.             begin = i;
  21.             sum = a[i];
  22.         }

  23.         end = i;

  24.         if (sum > max_sum)
  25.         {
  26.             max_sum = sum;
  27.             *pbegin = begin;
  28.             *pend = end;
  29.         }
  30.     }

  31.     return max_sum;
  32. }

  33. // 找出和最大的子序列
  34. int main()
  35. {
  36.     int lines = 0;
  37.     scanf("%d", &lines);

  38.     // 为结果申请空间
  39.     int** presult = (int**)malloc(sizeof(int*) * lines);
  40.     for (int i = 0; i < lines; i++)
  41.     {
  42.         presult[i] = (int*)malloc(3 * sizeof(int));
  43.     }

  44.     int num = 0; // 读入的数字
  45.     int count = 0; // 一行的数字数量
  46.     int n = 0; // 当前处理的行数

  47.     for (n = 0; n < lines; n++)
  48.     {
  49.         scanf("%d", &count);

  50.         int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间

  51.         for (int i = 0; i < count; i++)
  52.         {
  53.             if (scanf("%d", &num) != EOF)
  54.             {
  55.                 pa[i] = num;
  56.             }
  57.         }

  58.         // 处理数据
  59.         int max_sum = 0;
  60.         int begin = 0;
  61.         int end = 0;

  62.         max_sum = Get_max_sum_array(pa, count, &begin, &end);

  63.         // 记录结果
  64.         presult[n][0] = max_sum;
  65.         presult[n][1] = begin + 1;
  66.         presult[n][2] = end + 1;

  67.         // 释放空间
  68.         free(pa);
  69.     }

  70.     // 统一输出结果
  71.     for (int i = 0; i < lines; i++)
  72.     {
  73.         printf("Case %d:\n", i + 1);
  74.         printf("%d %d %d\n", presult[i][0], presult[i][1], presult[i][2]);

  75.         if (i != lines - 1)
  76.         {
  77.             putchar('\n');
  78.         }
  79.     }

  80.     for (int i = 0; i < lines; i++)
  81.     {
  82.         free(presult[i]);
  83.     }
  84.     free(presult);

  85.     return 0;
  86. }
复制代码


这个版本的代码解决了之前的一些内存管理问题,应该不会再有指针数组释放空间时报错的情况了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-9 23:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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