c ++程序得到分段错误

时间:2012-12-26 19:21:47

标签: c++

我一直在研究一些编码,但我遇到了分段错误。我尽力让它发挥作用,但我一直都在失败。现在我正在寻求帮助。这是我的代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{

    string symbols = "ABCDEFGHIJKLMNOPRSTUVYZ_";

    int sim, a = 0;

    sim = symbols.size();

    string temp[sim];

    while(sim > 0)
    {
    sim--;

    temp[sim] = symbols.substr(sim, 1);

    cout << temp[sim] << endl;
    }

}

这种方法很有效但如果我做了一些改动就会崩溃。

我改变了:

    while(sim > 0)
    {
    sim--;

    temp[sim] = symbols.substr(sim, 1);

    cout << temp[sim] << endl;
    }

对此:

    while(a < sim)
    {
    a++;

    temp[a] = symbols.substr(a, 1);

    cout << temp[a] << endl;
    }

我得到了SIGFAULT,我真的不明白这是错的。我使用调试器并没有真正显示它崩溃的哪一行,它只显示:

编程接收信号SIGSEGV,分段故障。

__gnu_cxx::__exchange_and_add(int volatile *, int) () ()

4 个答案:

答案 0 :(得分:1)

考虑a == sim-1时会发生什么 - 您立即递增它,因此它变为sim,然后访问temp[a],尽管temp具有有效索引0sim-1

我建议你放弃语言扩展 - 即VLA - 并改为使用std::vector

答案 1 :(得分:1)

a == sim-1它将重新进入while循环时,在a处增加a++以便a == sim然后在尝试访问时会崩溃temp[a]

您可以通过在while循环的末尾而不是开头递增a来解决此问题。

答案 2 :(得分:0)

你的a temp [a]将作为索引从1到sim(包括)。 temp数组有sim元素,这意味着thay数组的有效索引从0到sim-1包含。

给你一个++;成为while循环中的最后一个语句,这将起作用。

答案 3 :(得分:0)

嗯,用temp [a]清楚,一个更微妙的问题是,如果a == sym,substr(a,1)将返回你分配给temp [a]的空字符串。这可能不会导致崩溃,但仍然是错误。