1

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

#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

4 回答 4

1

想想当a == sim-1你立即递增它时会发生什么,所以它变成了sim,然后访问temp[a],尽管对.temp有有效的索引。0sim-1

我建议您放弃语言扩展 - 即 VLA 的 - 并std::vector改用。

于 2012-12-26T19:24:37.000 回答
1

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

a您可以通过在 while 循环结束而不是开始时递增来解决此问题。

于 2012-12-26T19:26:50.843 回答
0

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

于 2012-12-26T19:34:15.173 回答
0

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

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

于 2012-12-26T19:25:58.683 回答