SIGSEGV: программа не выполняется последовательно

0

Моя программа получает 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.

Кстати, программа делает то, что она должна делать правильно: она открывает файл, читает строку и сохраняет ее в обратном порядке в другом файле.

  • 0
    Примечание: вы переключили argc и argv . argc должна быть с р а ф аргументов.
  • 0
    Спасибо за этот комментарий
Теги:
execution
gdb
sigsegv

1 ответ

3
Лучший ответ

программа не следует тому, что я считаю нормальным потоком выполнения.

Я не вижу никаких доказательств этого. Насколько я вижу, ваша программа следит за нормальным потоком выполнения, а затем падает после main возвратов.

Это происходит потому, что у вас есть неинициализированный указатель strinput, и вы пишете в непредсказуемое место, где указывает этот указатель.

Так получилось, что в вашей среде исполнения указатель указывает где-то на стек, поэтому вы повреждаете свой стек, а затем заставляете вас переходить на плохой адрес, вызывая сбои.

  • 0
    Ах да, это тоже. Возможно, даже более серьезная, чем ошибка, которую я обнаружил.
  • 0
    Большое спасибо. Когда я выполняю свою программу, используя gdb, почему она проходит через строки 21 -> 11 -> 21?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню