好的,让我们解决原来问题中的内存释放错误。你的代码中存在一些内存管理的问题,以及参数传递的一些问题。下面是修正后的代码:
#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 小助理,如未能正确解答您的问题,请继续追问。 |