如何在我的代码中解决 SIGSEGV
How to solve SIGSEGV in my code
有人可以帮助我解决问题吗?
我写了程序,它给了我分段错误,我不知道我能用它做什么,我尝试了几个小时来解决它,但我不能。
如果有人能帮忙,那就太好了!
这是我的代码:
#include <stdio.h>
#include <vector>
inline int fastScanfInt(FILE *input, int *x);
int main()
{
std::vector<int> v;
int t = 0;
fastScanfInt(stdin, &t);
int tmp = 0, test = 0;
test = fastScanfInt(stdin, &tmp);
while(test != EOF)
{
v.push_back(tmp);
test = fastScanfInt(stdin, &tmp);
}
std::vector<int>::iterator it;
int pos = 0, c, v_size = 0;
for(int i = 0; i < t; i++)
{
if(v[pos] % 2 == 0)
{
c = v[pos + 1];
it = v.begin();
std::advance(it, pos + 1);
v.erase(it);
v_size = v.size();
pos += c % v_size;
if(pos > (v_size - 1))
pos -= v_size;
}
else
{
c = v[pos];
it = v.begin();
std::advance(it, pos + 1);
v.insert(it, (c - 1));
v_size = v.size();
pos += c % v_size;
if(pos > (v_size - 1))
pos -= v_size;
}
}
for(int i = pos; i < v.size(); i++)
{
printf("%d ", v[i]);
}
for(int i = 0; i < pos; i++)
{
printf("%d ", v[i]);
}
}
inline int fastScanfInt(FILE *input, int *x)
{
register char c = getc(input);
if(c != EOF)
{
(*x) = 0;
for( ; ((c < 48) || (c > 57)); c = getc(input));
for( ; ((c > 47) && (c < 58)); c = getc(input))
(*x) = ((*x) << 1) + ((*x) << 3) + c - 48;
}
return c;
}
在索引v
时,应始终确保边界中的 i pos
。给它奇数个输入将导致if(v[pos] % 2 == 0)
行失败,因为 pos 会走得太远。
同样,std::advance(it, pos + 1);
可以带你出界。给它偶数个输入就可以做到这一点。
给它三个数字可以在没有段错误的情况下工作,因为第二个数字被存储,但第三个数字不是。我相信while(test != EOF)
无法将最终数字存储在向量中。
我实际上还没有自己修复代码,但是通过查看它崩溃的位置,我很确定如果您可以修复这些错误,您将处于更好的位置。
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- Ardunio UNO解决了多个重叠的定时器循环
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 两个文件使用彼此的功能-如何解决
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 在java中解决这段代码时面临循环中的问题
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 难以理解某些人解决IOI问题的源代码
- visual c++,如何获取解决方案目录中的代码
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 节俭并发:未解决的外部问题
- IpOpt拒绝解决不受约束的问题
- 如何解决这个超硬恒星的创造问题
- 循环无限运行C++解决骑士之旅问题
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- 如何解决非常大的阵列输入的SIGSEGV错误
- 如何在我的代码中解决 SIGSEGV