C++ SIGSEGV
Giorgos Keramidas
keramida at ceid.upatras.gr
Wed Sep 11 06:35:02 EEST 2002
On 2002-09-11 02:27, Nikos Kanellopoulos <nkan at panafonet.gr> wrote:
>
> Ο αρχικός κώδικας που με απασχολούσε ήταν ο εξής:
>
> ifstream myfile;
> myfile.open (path, ios::in);
>
> όπου το path ήταν extern char*. Πιο πριν γίνεται η ανάθεση
> path = yytext
> που είναι ασφαλής, αφού το flex φροντίζει για την εξασφάλιση μνήμης
> για την yytext (επίσης char*).
>
> Η τιμή του path σύμφωνα με την gdb (print path) είναι "5.txt\n". To
> "\n" δεν ευθύνεται για το πρόβλημα (δοκίμασα print path="5.txt" ,
> αλλά τα ίδια).
>
> Στο myfile.open() παίρνω SIGSEGV. Δεν θα έπρεπε να δουλεύει;
Κανόνας 1 του προγραμματισμού: Κάποια βλακεία κάνεις.
Μια από αυτές (προφανώς άσχετη με το file.open()) είναι ότι δεν έχεις
κάνει malloc()/new κάποιο μέρος μνήμης για το str[]. Ακόμα και με
"\n" στο filename δεν μπόρεσα να αναπαράγω το `bug':
charon at hades[06:30]/home/charon$ cat lala.cc
#include <fstream>
#include <iostream>
using namespace std;
int
main(int argc, char* argv[])
{
ifstream file;
char str[256];
file.open ("lala.cc", ios::in);
file.getline(str, 20);
file.close();
cout << str << endl;
file.open ("lala.cc\n", ios::in);
file.getline(str, 20);
file.close();
cout << str << endl;
}
charon at hades[06:33]/home/charon$ c++ lala.cc
charon at hades[06:33]/home/charon$ ./a.out
#include <fstream>
charon at hades[06:34]/home/charon$
- Giorgos
More information about the Linux-greek-users
mailing list