【问题标题】:How to return an array in a recursive function?如何在递归函数中返回一个数组?
【发布时间】:2022-01-26 14:08:00
【问题描述】:

我是一名 C 初学者,我正在尝试编写一个 merge_sort 函数。我在下面写了我的代码。

变量“array_global”是数组“a”和数组“b”之间的合并,所有合并过程都可以正常工作,当函数返回“array global”时会出现问题,因为它似乎只返回第一个数组的元素。

例如,如果“array_global”为[19, 26],则接收函数结果的整数指针“a”只接收[19]

我做错了什么? 为什么会这样?

提前谢谢

int *merge_sort(int array[], int len)
{
  if (len == 1)
  {
    return array;
  }
  else
  {
    int l1 = (len/2);
    int l2 = len - l1;
    int sub_array_1[l1]; int sub_array_2[l2];
    for (int i = 0; i<l1; i++)
    {
      sub_array_1[i] = array[i];
    }
    for (int i = l1; i<len; i++)
    {
      sub_array_2[i-l1] = array[i];
    }
    int *a = merge_sort(sub_array_1, l1);//Receives array_global value
    int a_size = (sizeof(a)/sizeof(int));
    int *b = merge_sort(sub_array_2, l2);//Receives array_global value
    int b_size = (sizeof(b)/sizeof(int));
    int mult = a_size + b_size;
    int *array_global = malloc(sizeof(*array_global)*mult);
    merge(a, b, a_size, b_size, array_global);
    return array_global;

  }
}

【问题讨论】:

  • 这里有一堆内存泄漏,因为在每个递归步骤中,你分配了一个你永远不会释放的临时数组。
  • 你如何确定结果只包含[19]
  • 您可以就地进行整个排序(即将输出存储在输入数组中)。随后,该函数不需要返回任何内容。
  • @bbbbbbbbb:如果你能写一个合并排序,我想知道。这是本书显示副本的少数算法之一。请注意,您只需要一个额外的缓冲区并且可以振荡。
  • @bbbbbbbbb 如果指针作为另一个函数的参数传递,是否可以释放指针中分配的内存?我正在考虑在“合并”函数中释放指针“array_global”,但如果可能的话,我会考虑。我也想知道,如果你不返回任何值,你不能做一个递归函数吗?

标签: arrays c pointers recursion mergesort


【解决方案1】:

这里的错误:

int a_size = (sizeof(a)/sizeof(int));

应该阅读

int a_size = l1;

sizeof 不测量堆上数组的大小。

这里的内存泄漏:

return array_global;

应该是:

free(a);
free(b);
return array_global;

【讨论】:

  • 但是array_global 仍然存在内存泄漏,对吗?有没有办法释放那个指针?
  • @Luigi_S_R:merge_sort 的初始调用者需要处理这个问题。通常,在首先需要副本的地方使用合并排序。
猜你喜欢
  • 2013-08-07
  • 2022-01-02
  • 1970-01-01
  • 2016-01-24
  • 2020-02-20
  • 2015-10-23
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多