2014-09-14 3 views
0

내 프로그램이 SIGSEGV를 수신하고 디버그하려고합니다. 이상한 것은 gdb를 사용하여 줄 단위로 갈 때 프로그램이 정상적인 실행 흐름이어야한다고 생각하지 않는다는 것입니다. 이것은 내가 GDB에서 볼 것입니다SIGSEGV : 프로그램이 순차적으로 실행되지 않습니다.

#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; 
} 

:

내 코드입니다 그런데

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. 

프로그램이 올바르게 수행이 무엇을 의미하는지 않습니다 : 그것은 파일을 엽니 다 , 문자열을 읽고 그것을 다른 파일에 역순으로 저장합니다.

+0

사이드 노트 : 당신은'argc'와'argv'를 바꾸 었습니다. argc는 인수의 * c * ount 여야합니다. – Csq

+0

그 주셔서 감사합니다 – iguarna

답변

3

프로그램이 정상적인 실행 흐름이어야한다고 생각하지 않습니다.

나는 그런 증거가 보이지 않습니다. 지금까지 볼 수있는 한, 귀하의 프로그램 다음에이고 main이 반환 된 후에는이 충돌합니다.

초기화되지 않은 포인터 strinput이 있고 포인터가 가리키는 위치 인 에 쓸 수 있습니다.

포인터가 스택의 어딘가를 가리키는 실행 환경에서는 스택이 손상되어 잘못된 주소로 이동하여 충돌이 발생합니다.

+0

오, 그래, 그 역시. 아마 내가 봤던 오류보다 더 심할 것 같아. – 5gon12eder

+0

고마워요. gdb를 사용하여 프로그램을 실행할 때 21 -> 11 -> 21 행을 지나는 이유는 무엇입니까? – iguarna

+0

라인 21에서 리턴하기 직전에 로컬 객체'finput'과'foutput'을 파괴해야합니다. 나는 GCC가 소멸자 중 한 명 또는 두 명 모두에게 "assinged"한 줄을 추측하고있다. (그리고 당신의 GCC는 아마도 꽤 오래되었다.) –

관련 문제