x-Aaron 发表于 前天 21:46

指针数组释放空间报错

#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;
}

FishC 发表于 前天 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;
    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 发表于 前天 21:46

FishC 发表于 前天 21:46

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 发表于 前天 21:48

原题:

FishC 发表于 前天 21:49

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]
查看完整版本: 指针数组释放空间报错