我的程序收到一个 SIGSEGV,我正在尝试调试。奇怪的是,当我使用 gdb 逐行执行时,程序并没有遵循我认为应该正常执行的流程。
这是我的代码:
#include <iostream>
#include <fstream>
using namespace std;
char * str_reverse(char * s);
int main (int argv, char ** argc){
char * strinput;
fstream finput;
fstream foutput;
finput.open(argc[1], ios::in);
finput >> strinput;
finput.close();
foutput.open(argc[2], ios::out);
foutput << str_reverse(strinput);
foutput.close();
return 1;
}
char * str_reverse(char * s){
int len = 0;
while (s[len] != '\000') len++;
char * rev = new char[len];
for (int i = 0; i < len; i++)
rev[i] = s[len-(i+1)];
rev[len] = '\000';
return rev;
}
这是我在 gdb 中看到的:
18 foutput << str_reverse(strinput);
(gdb) n
19 foutput.close();
(gdb) n
21 return 1;
(gdb) n
11 fstream foutput;
(gdb) n
21 return 1;
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
顺便说一句,该程序正确地完成了它应该做的事情:它打开一个文件,读取一个字符串并将其反向保存在另一个文件中。
最佳答案
the program is not following what I think should be the normal execution flow.
我没有看到任何证据。据我所知,您的程序正在遵循正常的执行流程,然后在main
返回后崩溃。
发生这种情况是因为您有一个未初始化的指针 strinput
,并且您写入了该指针指向的不可预测位置。
碰巧在您的执行环境中,指针指向堆栈中的某处,因此您损坏了您的堆栈,然后导致您跳转到一个错误的地址,从而导致崩溃。
关于c++ - SIGSEGV : Program doesn't execute sequentially,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25835944/