C++分段错误中的堆算法

Posted

技术标签:

【中文标题】C++分段错误中的堆算法【英文标题】:Heap's Algorithm in C++ segmentation fault 【发布时间】:2014-08-28 02:00:48 【问题描述】:

我一直致力于实现堆算法的递归版本。这是伪代码的链接:http://en.wikipedia.org/wiki/Heap%27s_algorithm

在我进入递归部分之前,一切都很顺利。我知道我还没有加入交换元素,但我还没有走到那一步。运行失败而没有显示错误,直到我使用 gcc 调试器告诉我存在分段错误。这是我的代码:

#include <string>
#include <iostream>
using namespace std;

string* permute(int n, string array[2])
    if (n==1)
        return array;
    
    else
        for(int c=1; c<=n;c++)
            permute(n--,array);
        
    


int main() 
    string array[2]="a","b";
    permute(2,array);
    return 0;

【问题讨论】:

函数permuteelse部分的return语句如何?你为什么要在从1n 的循环内递减n 【参考方案1】:

抛开整个实现似乎错误的事实不谈,您遇到运行时异常的直接原因是您对permute(2,array) 的递归调用,最终导致堆栈溢出。发生这种情况是因为您使用 n-- 而不是 --n(或更准确地说,n-1)调用它。

【讨论】:

非常感谢,我是初学者,所以我们总是感谢您的帮助! @user2514631:不客气 :) 还有很多工作要做。【参考方案2】:

您不应该在递归调用中后减 n,而是先减:

permute(--n,array);

【讨论】:

【参考方案3】:

试试permute( --n, array ) 你传递的是 2 而不是递减的副本

【讨论】:

【参考方案4】:

你必须使用前缀减法:

改变:

 permute(n--,array);

到:

 permute(--n,array);

这样,您首先递减'n'然后然后调用permute。

在第一种情况下,您永远不会减去并且您有无限递归。

【讨论】:

以上是关于C++分段错误中的堆算法的主要内容,如果未能解决你的问题,请参考以下文章

C++ 分段错误 OpenCV

在 C++ 中使用向量时出现分段错误

C++ 快速排序段错误

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

在 C++ 中比较来自向量的字符串时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11