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