指针数组释放空间报错
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <stdlib.h>
// Kadane算法
// 找到以M = a为结尾的序列和最大值
// 将x = a和之前的最大值求和
// 则以x为结尾的最大和序列:或
int Get_max_sum_array(int a[], int size, int *pbegin, int *pend)
{
int max_sum = a;
int sum = a;
int begin = 0;
int end = 0;
for (int i = 1; i < size; i++) // end就是当前元素
{
if (a + sum >= a) // 继续
{
sum += a;
}
else // 更新起点
{
begin = i;
sum = a;
}
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 (int 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);
// 释放空间
free(pa);
// 记录结果
*(*(presult + n) + 1) = max_sum;
*(*(presult + n) + 2) = begin + 1;
*(*(presult + n) + 3) = end + 1;
}
// 统一输出结果
for (int i = 0; i < lines; i++)
{
printf("Case %d:\n", i + 1);
printf("%d %d %d\n", *(*(presult + i) + 1), *(*(presult + i) + 2), *(*(presult + i) + 3));
if (i != lines - 1)
{
putchar('\n');
}
}
for (int i = 0; i < lines; i++)
{
int* p = *(presult + i);
free(p);
}
return 0;
}
C:\Users\user_xk\Desktop
指针数组presult的空间释放不是遍历释放每一个指针,再释放自身吗
但是,当我把中间代码删除后,又没有报错了,感觉很奇怪
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));
}
for (int i = 0; i < lines; i++)
{
int* p = *(presult + i);
free(p);
}
free(presult);
return 0;
} 你代码中有几个地方需要修改和注意。首先,让我们来解决你遇到的问题。
1. 在 `Get_max_sum_array` 函数中的参数应该是数组 `int *a` 而不是单个整数。
2. 记录结果时,你使用的是索引从1开始,而数组索引应从0开始。
3. 最后,你没有释放 `presult` 整体的空间。
以下是修正后的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
// Kadane算法
// 找到以M为结尾的序列和最大值
int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
{
int max_sum = a;
int sum = a;
int begin = 0;
int end = 0;
for (int i = 1; i < size; i++)
{
if (sum >= 0)
{
sum += a;
}
else
{
begin = i;
sum = a;
}
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 = (int*)malloc(3 * sizeof(int));
}
int num = 0; // 读入的数字
int count = 0; // 一行的数字数量
for (int 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 = num;
}
}
// 处理数据
int max_sum = 0;
int begin = 0;
int end = 0;
max_sum = Get_max_sum_array(pa, count, &begin, &end);
// 记录结果
presult = max_sum;
presult = begin + 1;
presult = end + 1;
// 释放空间
free(pa);
}
// 统一输出结果
for (int i = 0; i < lines; i++)
{
printf("Case %d:\n", i + 1);
printf("%d %d %d\n", presult, presult, presult);
if (i != lines - 1)
{
putchar('\n');
}
}
for (int i = 0; i < lines; i++)
{
free(presult);
}
free(presult);
return 0;
}
此代码修正了原代码中的问题并确保正确释放内存。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 x-Aaron 发表于 2025-01-27 21:46
看起来你提供了一些代码片段,我将其格式化为BBCode并且尝试确保所有问题都被修正。
修正后的代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
// Kadane算法
// 找到以M为结尾的序列和最大值
int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
{
int max_sum = a;
int sum = a;
int begin = 0;
int end = 0;
for (int i = 1; i < size; i++)
{
if (sum >= 0)
{
sum += a;
}
else
{
begin = i;
sum = a;
}
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 = (int*)malloc(3 * sizeof(int));
}
int num = 0; // 读入的数字
int count = 0; // 一行的数字数量
for (int 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 = num;
}
}
// 处理数据
int max_sum = 0;
int begin = 0;
int end = 0;
max_sum = Get_max_sum_array(pa, count, &begin, &end);
// 记录结果
presult = max_sum;
presult = begin + 1;
presult = end + 1;
// 释放空间
free(pa);
}
// 统一输出结果
for (int i = 0; i < lines; i++)
{
printf("Case %d:\n", i + 1);
printf("%d %d %d\n", presult, presult, presult);
if (i != lines - 1)
{
putchar('\n');
}
}
for (int i = 0; i < lines; i++)
{
free(presult);
}
free(presult);
return 0;
}
希望这些修改可以解决你遇到的问题。如果你还有更多问题或需要进一步的帮助,请随时提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 原题: x-Aaron 发表于 2025-01-27 21:48
原题:
好的,让我们解决原来问题中的内存释放错误。你的代码中存在一些内存管理的问题,以及参数传递的一些问题。下面是修正后的代码:
#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;
int sum = a;
int begin = 0;
int end = 0;
for (int i = 1; i < size; i++)
{
if (sum >= 0)
{
sum += a;
}
else
{
begin = i;
sum = a;
}
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 = (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 = num;
}
}
// 处理数据
int max_sum = 0;
int begin = 0;
int end = 0;
max_sum = Get_max_sum_array(pa, count, &begin, &end);
// 记录结果
presult = max_sum;
presult = begin + 1;
presult = end + 1;
// 释放空间
free(pa);
}
// 统一输出结果
for (int i = 0; i < lines; i++)
{
printf("Case %d:\n", i + 1);
printf("%d %d %d\n", presult, presult, presult);
if (i != lines - 1)
{
putchar('\n');
}
}
for (int i = 0; i < lines; i++)
{
free(presult);
}
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;
int sum = a;
int begin = 0;
int end = 0;
for (int i = 1; i < size; i++)
{
if (sum >= 0)
{
sum += a;
}
else
{
begin = i;
sum = a;
}
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 = (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 = num;
}
}
// 处理数据
int max_sum = 0;
int begin = 0;
int end = 0;
max_sum = Get_max_sum_array(pa, count, &begin, &end);
// 记录结果
presult = max_sum;
presult = begin + 1;
presult = end + 1;
// 释放空间
free(pa);
}
// 统一输出结果
for (int i = 0; i < lines; i++)
{
printf("Case %d:\n", i + 1);
printf("%d %d %d\n", presult, presult, presult);
if (i != lines - 1)
{
putchar('\n');
}
}
for (int i = 0; i < lines; i++)
{
free(presult);
}
free(presult);
return 0;
}
这个版本的代码解决了之前的一些内存管理问题,应该不会再有指针数组释放空间时报错的情况了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]