鱼C论坛

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

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

[复制链接]
发表于 前天 21:46 | 显示全部楼层 |阅读模式

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

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

x
#define _CRT_SECURE_NO_WARNINGS

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

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

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++) // end就是当前元素
        {
                if (a[i] + sum >= a[i]) // 继续
                {
                        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 (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;
}
最佳答案
前天 21:46
你代码中有几个地方需要修改和注意。首先,让我们来解决你遇到的问题。

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[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; // 一行的数字数量

    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);

        // 记录结果
        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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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[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; // 一行的数字数量

    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);

        // 记录结果
        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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 前天 21:46 | 显示全部楼层
(VQZK$%`1~)2_H`6DK(P}EB.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 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[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; // 一行的数字数量

    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);

        // 记录结果
        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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 21:48 | 显示全部楼层
原题: PILRA6L%OKGB{QWH6V@.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 21:49 | 显示全部楼层


好的,让我们解决原来问题中的内存释放错误。你的代码中存在一些内存管理的问题,以及参数传递的一些问题。下面是修正后的代码:
#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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-29 10:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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