C 程序获取细分故障

c++ program gets segmentation fault

本文关键字:故障 细分 获取 程序      更新时间:2023-10-16

我一直在做一些编码,并且遇到了分段故障。我尽了最大的努力使其正常工作,但我一直失败。现在我要寻求帮助。这是我的代码:

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

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

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

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

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

您的temp [a]将以1到SIM的索引(包含)。温度阵列具有模拟元素,这意味着Thay数组的有效索引从0到SIM-1(包括Sim-1)。

移动a ;成为循环时的最后一个语句,这将起作用。

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