Моя программа получает 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.
Кстати, программа делает то, что она должна делать правильно: она открывает файл, читает строку и сохраняет ее в обратном порядке в другом файле.
программа не следует тому, что я считаю нормальным потоком выполнения.
Я не вижу никаких доказательств этого. Насколько я вижу, ваша программа следит за нормальным потоком выполнения, а затем падает после main
возвратов.
Это происходит потому, что у вас есть неинициализированный указатель strinput
, и вы пишете в непредсказуемое место, где указывает этот указатель.
Так получилось, что в вашей среде исполнения указатель указывает где-то на стек, поэтому вы повреждаете свой стек, а затем заставляете вас переходить на плохой адрес, вызывая сбои.
argc
иargv
.argc
должна быть с р а ф аргументов.