【问题标题】:C SegFault when recursing with an array of pointers使用指针数组递归时的 C SegFault
【发布时间】:2021-05-10 20:00:24
【问题描述】:

我有一个函数,它接受一个指向双精度数的指针数组,该数组除以数组并递归。这是一个简化的版本:

void recurse(double **ptr_array, int N) {
    int n = N / 2;
    double **new_ptr_array = (double **) malloc(n * sizeof(double *));
    for (int i = 0; i < n; i++) {
        new_ptr_array[i] = ptr_array[i]; // segfault here
    }
    recurse(new_ptr_array, n);
    // repeat for 2nd half
}

我发现当第一次调用该函数时,它运行良好,但在第一次递归时,我会在分配上得到一个段错误(在代码中表示)。我什至尝试访问ptr_array[0],但这也没有用。

有人可以向我解释为什么只有在递归时才会失败?

【问题讨论】:

  • 我发现您发布的代码没有任何问题。因此,我怀疑问题出在您未发布的代码中。请提供段错误的minimal reproducible example
  • @AndreasWenzel 您的怀疑确实是正确的。我尝试创建最小的可重现示例,并且成功了,这让我再次检查了我的代码。原来我对新数组的实例化超出了范围,因此 null 实际上是在递归中传递的。
  • 是的,尝试创建minimal reproducible example 的过程实际上解决了问题,使问题变得多余是很常见的。 :-) 这就是为什么总是鼓励创建一个的原因之一。

标签: c pointers segmentation-fault


【解决方案1】:

正如 Andreas 所建议的,问题确实不在我发布的代码中。我的代码实际上是这样的:

void recurse(double **ptr_array, int N) {
    int n = N / 2;
    double **new_ptr_array
    if (true) { // some arbitrary condition
        double **new_ptr_array = (double **) malloc(n * sizeof(double *));
        for (int i = 0; i < n; i++) {
            new_ptr_array[i] = ptr_array[i]; // segfault here
        }
    }
    recurse(new_ptr_array, n);
    // repeat for 2nd half
}

我不小心创建了一个超出递归调用范围的 new_ptr_array 的新实例,因此 null 实际上被传递给递归函数。

【讨论】:

  • 当我创建一个隐藏另一个变量的变量时,我的 MSVC 编译器会警告我。我相信它默认会这样做。您可能可以将编译器设置为执行相同的操作。请参阅此问题以使用编译器 gcc/clang 执行此操作:Get warning when a variable is shadowed
  • This 如果您对更多诊断编译器标志感兴趣(至少对于 clang/gcc),SO 帖子还提供了一些有趣的阅读。
猜你喜欢
  • 2014-05-10
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2014-04-28
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多