【问题标题】:c++ program gets segmentation faultc++程序得到分段错误
【发布时间】:2012-12-26 19:21:47
【问题描述】:

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

#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) () ()

【问题讨论】:

  • 你知道程序在什么时候崩溃了吗? (第一次尝试运行,最后等)
  • 为了正确起见,拼写为“segfault”。 “分段错误”的缩写。 SIGwhatever 有一个特殊的含义——也就是说,它往往是一个常数,其值代表信号。在这种情况下,拼写为“SIGSEGV”。一个或另一个是合适的,但你必须选择一个。
  • cHao -> 好的,下次我会做的...谢谢解决,我移动了一个++;到循环结束,它工作正常,谢谢大家:)

标签: c++


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    a == sim-1 重新进入while 循环时,在a++ 处增加a,这样a == sim 就会在尝试访问temp[a] 时崩溃。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2021-01-08
          • 1970-01-01
          • 2015-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-12
          • 2018-11-18
          • 2011-05-23
          相关资源
          最近更新 更多