|
|
发表于 2025-1-27 21:49:23
|
显示全部楼层
好的,让我们解决原来问题中的内存释放错误。你的代码中存在一些内存管理的问题,以及参数传递的一些问题。下面是修正后的代码:
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- // Kadane算法
- // 找到以a[]结尾的序列和最大值
- int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
- {
- int max_sum = a[0];
- int sum = a[0];
- int begin = 0;
- int end = 0;
- for (int i = 1; i < size; i++)
- {
- if (sum >= 0)
- {
- sum += a[i];
- }
- else
- {
- begin = i;
- sum = a[i];
- }
- end = i;
- if (sum > max_sum)
- {
- max_sum = sum;
- *pbegin = begin;
- *pend = end;
- }
- }
- return max_sum;
- }
- // 找出和最大的子序列
- int main()
- {
- int lines = 0;
- scanf("%d", &lines);
- // 为结果申请空间
- int** presult = (int**)malloc(sizeof(int*) * lines);
- for (int i = 0; i < lines; i++)
- {
- presult[i] = (int*)malloc(3 * sizeof(int));
- }
- int num = 0; // 读入的数字
- int count = 0; // 一行的数字数量
- int n = 0; // 当前处理的行数
- for (n = 0; n < lines; n++)
- {
- scanf("%d", &count);
- int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间
- for (int i = 0; i < count; i++)
- {
- if (scanf("%d", &num) != EOF)
- {
- pa[i] = num;
- }
- }
- // 处理数据
- int max_sum = 0;
- int begin = 0;
- int end = 0;
- max_sum = Get_max_sum_array(pa, count, &begin, &end);
- // 记录结果
- presult[n][0] = max_sum;
- presult[n][1] = begin + 1;
- presult[n][2] = end + 1;
- // 释放空间
- free(pa);
- }
- // 统一输出结果
- for (int i = 0; i < lines; i++)
- {
- printf("Case %d:\n", i + 1);
- printf("%d %d %d\n", presult[i][0], presult[i][1], presult[i][2]);
- if (i != lines - 1)
- {
- putchar('\n');
- }
- }
- for (int i = 0; i < lines; i++)
- {
- free(presult[i]);
- }
- free(presult);
- return 0;
- }
复制代码
确保你将这段代码放在标签内,以便在Discuz!论坛上正确显示格式:
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- // Kadane算法
- // 找到以a[]结尾的序列和最大值
- int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
- {
- int max_sum = a[0];
- int sum = a[0];
- int begin = 0;
- int end = 0;
- for (int i = 1; i < size; i++)
- {
- if (sum >= 0)
- {
- sum += a[i];
- }
- else
- {
- begin = i;
- sum = a[i];
- }
- end = i;
- if (sum > max_sum)
- {
- max_sum = sum;
- *pbegin = begin;
- *pend = end;
- }
- }
- return max_sum;
- }
- // 找出和最大的子序列
- int main()
- {
- int lines = 0;
- scanf("%d", &lines);
- // 为结果申请空间
- int** presult = (int**)malloc(sizeof(int*) * lines);
- for (int i = 0; i < lines; i++)
- {
- presult[i] = (int*)malloc(3 * sizeof(int));
- }
- int num = 0; // 读入的数字
- int count = 0; // 一行的数字数量
- int n = 0; // 当前处理的行数
- for (n = 0; n < lines; n++)
- {
- scanf("%d", &count);
- int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间
- for (int i = 0; i < count; i++)
- {
- if (scanf("%d", &num) != EOF)
- {
- pa[i] = num;
- }
- }
- // 处理数据
- int max_sum = 0;
- int begin = 0;
- int end = 0;
- max_sum = Get_max_sum_array(pa, count, &begin, &end);
- // 记录结果
- presult[n][0] = max_sum;
- presult[n][1] = begin + 1;
- presult[n][2] = end + 1;
- // 释放空间
- free(pa);
- }
- // 统一输出结果
- for (int i = 0; i < lines; i++)
- {
- printf("Case %d:\n", i + 1);
- printf("%d %d %d\n", presult[i][0], presult[i][1], presult[i][2]);
- if (i != lines - 1)
- {
- putchar('\n');
- }
- }
- for (int i = 0; i < lines; i++)
- {
- free(presult[i]);
- }
- free(presult);
- return 0;
- }
复制代码
这个版本的代码解决了之前的一些内存管理问题,应该不会再有指针数组释放空间时报错的情况了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|