SIGSEGV:程序不按顺序执行

时间:2014-09-14 17:23:03

标签: c++ gdb execution sigsegv

我的程序收到一个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.

顺便说一下,程序执行正确的操作:它打开一个文件,读取一个字符串并将其保存在另一个文件中。

1 个答案:

答案 0 :(得分:3)

  

程序没有遵循我认为应该是正常的执行流程。

我没有看到任何证据。据我所知,您的程序遵循正常的执行流程,然后main返回后崩溃。

这种情况正在发生,因为你有一个未初始化的指针strinput,并且你写入指针指向的不可预测的位置。

在您的执行环境中,指针指向堆栈上的某处,这样就会破坏堆栈,从而导致您跳转到错误的地址,从而导致崩溃。