strcat erzeugt Speicherzugriffsfehler
-
Is ne gute Frage!
hab path mit char *path angelegt!
Ich glaube nicht, oder?
Mal überlegen:
char *path = "/home/Andreas/";
legt mir einen Zeiger an der auf 15 Byte im Arbeitsspeicher zeigt, oder?
Hmm, also bekomm ich einen Speicherzugriffsfehler wenn ich was anhängen will!
Richtig?
Dann wäre die Frage wie ich das sinnvoll lösen könnte?
Weil ich weiß beim anlegen von Path nie wie lang der String ist der rein
soll!
-
Hi,
ich wuerde es so machen:
/* speicher fuer 255 zeichen reservieren, bei pfadangaben geht man IMHO von einer maximalgroesse von 255 zeichen aus; es sollte also eigentlich gross genug sein; nicht vergessen: speicher wieder freigeben */ char *path = malloc ( 255 ); /*....*/ void irgendwas (char *path, char *filename) { char *pathfilename; int path_len = strlen ( path ); int real_filename_len = strlen ( path ) + 1; /*+1 weil '\0'*/ /*wenn groesse beider zeichenketten zusammen > 255*/ if ( (path_len + real_filename_len) > 255 ) /*versuche speicher mit groesse beider strings zu reallocieren*/ if ( !realloc ( path, path_len + real_filename_len ) ) return; pathfilename = strcat(path,filename); }
Wenn ich keinen Fehler gemacht habe, sollte das so funktionieren
mfg
v R
-
Original erstellt von virtuell Realisticer:
Hi,ich wuerde es so machen:
[...] if ( !realloc ( path, path_len + real_filename_len ) ) [...] }
Wenn ich keinen Fehler gemacht habe, sollte das so funktionieren
mfg
v RAutsch. realloc gibt den Pointer auf den neuen Speicher zurück, der von path wrd ungültig. Auch ein
path =realloc(path,...)
ist ein beliebter Fehler, weil wenn realloc schief geht man dadurch ein Speicherloch erzeugt. Also, besser:
cahr* temp; temp =realloc(path,...); if (NULL==temp) { fehler }; path = temp;
[ Dieser Beitrag wurde am 09.05.2003 um 12:02 Uhr von virtual editiert. ]
-
Nee, leider nicht.
Das strcat erzeugt immer noch einen Speicherzugriffsfehler!
Musste auch beim Allokieren ein (char davorschreiben, weil
er sonst gemeckert hatte.
Kann das auch sein das das daran liegt das das in meinem Quelltext
mit Objekten arbeite?
Ich meine, in meiner Klasse FILE_ deklariere ich die Variabele,
und erst im Konstruktor kann ich den Arbeitsspeicher Allokieren!
Macht das was aus?
-
Autsch. realloc gibt den Pointer auf den neuen Speicher zurück, der von path wrd
ungültig. Auch einUps, aber war doch klar dass ich was falsch mache *g*
Musste auch beim Allokieren ein (char davorschreiben, weil
er sonst gemeckert hatte.Dachte eigentlich, dass das implizit gemacht wird...
Ich meine, in meiner Klasse FILE_ deklariere ich die Variabele,
und erst im Konstruktor kann ich den Arbeitsspeicher Allokieren!
Macht das was aus?Sollte eigentich nicht, denn du wirst die Variable ja erst dann nutzen,
wenn du Speicher fuer dein Objekt erzeugt hast.Vielleicht zeigst du noch en bissle mehr Code
mfg
v R
-
Ich muss mich ja schon schämen!!!!!!!!!!
Ich hatte path und filename gar keine Werte zugewiesen!
Das ist mir gerade aufgefallen!
Habe jetzt zuerst mal vermutet das daher der Fehler kam.
Hab jetzt erst mal den ursprünglichen Code ohne das Allokieren
depostet!// file.h class FILE_ { private: char *path; char *filename ... public: FILE_::FILE_(); FILE_::~FILE_(); int FILE_::init(char *, char*); }; // file.c #include ... ... FILE_::FILE_() { path = "\0"; <----------------- :-D filename = "\0"; <----------------- :-D ... } int FILE_::init(char *path, char *filename) { char *pathfilename = strcat(path,filename); if ((stat(pathfilename,&attribut) == NULL) // attribut ist eine Eigenschaft der Klasse FILE_ { errortext = "stat fehlgeschlagen"; return 1; } return 0; }
Und noch ne saublöde Frage:
Nachdem ich char *path = (char *)malloc(255);
mache.
Kann man dann sowas wie path = "Hallo Welt!\n" machen?
Einfach so als wenn nix gewesen wäre?So, nun eure Meinung wie ich es machen soll!
Und nun eure Meinung!
-
Zwischendurch mal gefragt:
Kann mir einer sagen, warum das mit nem Debugger "gdb" reibungslos
funktioniert!?
-
Kann man dann sowas wie path = "Hallo Welt!\n" machen?
Nein, du machst das dann mittels 'strcpy' oder 'strncpy'.
path = "\0";
filename = "\0";Aehm, kann mich auch irren, aber sollte das eigentlich _nicht_ funktionieren?
Wenn du das Nullterminierungszeichen zuweisen willst, haett ich das so gemacht:*path = "\0"; *filename = "\0";
Aber den Speicher wuerde ich im CTor schon reservieren. Sonst rufst du
'init' auf, und fuer 'path' und 'filename' ist immernoch kein Speicher
reserviert. Im DTor dann natuerlich Speicher wieder freigeben.Kann mir einer sagen, warum das mit nem Debugger "gdb" reibungslos
funktioniert!?Sollte er eigentlich nicht.
mfg
v R
-
Wenn ich euch richtig verstanden habe, sollte ich das so machen?
In FILE_::FILE_()
class FILE_ { private: char *fileame; strcpy(filename,"teamerling.tar"); char *path = (char *)malloc(255); strcpy(path,"/home/Andreas/"); ... ... };
In FILE_::init
FILE_::init(char *path, char *filename) char *pathfile; char *temp; int len_path = strlen(path); int len_file = strlen(file); if ((len_path+len_file) > 255) { temp = realloc(path,len_path+len_file); if (temp == NULL) { FEHLER } path = temp; } pathfilename = strcat(path,filename); ... ... }
Hab ich das so richtig verstanden?
Ich bekomm beim Kompilieren folgenden Fehler:
file.c: In methodint FILE_::init (char *, char *)': file.c:31: cannot convert \
void *' to `char *' in assignment
Die zweite Zeile bezieht sich auf:
temp = realloc(path,len_path+len_file);
Habs dann versucht mit
void *temp;
Aber dann meckert er:
file.c: In methodint FILE_::init (char *, char *)': file.c:37: cannot convert \
void *' to `char *' in assignment
Wobei sich die zweite Zeile auf:
path = temp;
bezieht!
-
char *fileame;
strcpy(filename,"teamerling.tar");bitte beschäftige dich mit zeigern!
filename hat keinen speicher!
lies dir mal n tutoria über zeiger durch: http://pw1.netcom.com/~tjensen/ptr/pointers.htm
-
Original erstellt von BugBott:
Wenn ich euch richtig verstanden habe, sollte ich das so machen?In FILE_::FILE_()
class FILE_ { private: char *fileame; strcpy(filename,"teamerling.tar"); char *path = (char *)malloc(255); strcpy(path,"/home/Andreas/"); ... ... };
Siehe hierzu beitrag von Shade
In FILE_::init
FILE_::init(char *path, char *filename) char *pathfile; char *temp; int len_path = strlen(path); int len_file = strlen(file);
Bei 'len_file' machst du noch ein '+ 1' dahinter, denn strcat schliesst die
neue Zeichenkette mit einem weiteren Zeichen (Nullterminierungszeichen) abif ((len_path+len_file) > 255) { temp = realloc(path,len_path+len_file); if (temp == NULL) { FEHLER } path = temp; } pathfilename = strcat(path,filename); ... ... }
Hab ich das so richtig verstanden?
Ich bekomm beim Kompilieren folgenden Fehler:
file.c: In methodint FILE_::init (char *, char *)': file.c:31: cannot convert \
void *' to `char *' in assignmentWie gesagt, dachte dass das eigentlich implizit passiert, offentsichtlich
nicht, du musst also castenDie zweite Zeile bezieht sich auf:
temp = realloc(path,len_path+len_file);
Habs dann versucht mit
void *temp;
Aber dann meckert er:
file.c: In methodint FILE_::init (char *, char *)': file.c:37: cannot convert \
void *' to `char *' in assignment
Wobei sich die zweite Zeile auf:
path = temp;
bezieht!Klar, hier fehlt natuerlich jetzt der cast
mfg
v R[ Dieser Beitrag wurde am 09.05.2003 um 20:38 Uhr von virtuell Realisticer editiert. ]
-
Hi Leutz,
habs jetzt endlich hinbekommen!
Hab mir die Doku über Zeiger durchgelesen!
THX4help