我一直在研究一些编码,但我遇到了分段错误。我尽力让它发挥作用,但我一直都在失败。现在我正在寻求帮助。这是我的代码:
#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) () ()
答案 0 :(得分:1)
考虑a == sim-1
时会发生什么 - 您立即递增它,因此它变为sim
,然后访问temp[a]
,尽管temp
具有有效索引0
到sim-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]的空字符串。这可能不会导致崩溃,但仍然是错误。