malloc()
-
Hi, ich habe mir heute eine Frage gestellt und hoffe, dass ihr mir helfen koennt.
char *getfilename(char path[]) { int plength, flength, i; char *buf; plength = strlen(path); for (i=plength-1; i>=0; i--) { if (path[i]=='\\') break; } if (i==0) return path; flength = strlen(&path[i+1]); buf = (char *) malloc(flength +11); strcpy(buf, &path[i+1]); return buf; } int main(int argc, char* argv[]) { char *leetfile=NULL; ... leetfile = strcat(getfilename(argv[2]), "_leet.txt"); }
Dieser Code funktioniert soweit auch. Jedoch hat sich mir die Frage gestellt, was denn *leetfile fuer eine Addresse hat. Eigentlich ja NULL, also muesste ich doch eigentlich vorher noch mit
leetfile = (char *) malloc(strlen(getfilename(argv[2]))+10);
Speicher allokieren, oder nicht?
Wird evtl. leetfile mitleetfile = strcat(getfilename(argv[2]), "_leet.txt");
schon eine gueltige Addresse zugewiesen, naemlich die von buf aus getfilename() ?
Wie immer: Danke im Voraus
.
-
strcat() liefert afaik den Anfang des verketteten Speicherbereiches zurück - also letztendlich den Pointer, den du als ersten Parameter angegeben hast. Dieser Pointer hat eine definierte Adresse und zeigt auch auf einen definierten Speicherbereich (den du mit "buf=malloc(...);" erzeugt und mit "return buf;" an dein Hauptprogramm übergeben hast), also ist das Programm so in Ordnung. Wenn du für deinen leetfile-Pointer noch zusätzlichen Speicher belegen würdest, wäre dieser nach der Zuweisung nicht mehr erreichbar (was in großen Programmen schnell zu Speicherplatz-Problemen führen könnte).
PS: und glücklicherweise hast du auch genug Platz für den angehängten String gelassen
-
Hi!
Bin zwar noch nicht richtig wach, aber ich versuchs mal:
strcat hängt das zweite Argument an das erste dran und gibt dir dann nen Zeiger auf das (jetzt erweiterte) erste Argument zurück. Demnach müssten buf und leetfile auf die selbe Speicherstelle zeigen.
Aber der Speicher, den du lokal in der Funktion getfilename allozierst, wird nirgends wieder freigegeben, oder? Das sieht mir nicht ganz sauber aus...
-
bin wirklich noch nicht wach; statt editieren auf zitieren gedrückt...
-
GuybrushThreepwood schrieb:
Aber der Speicher, den du lokal in der Funktion getfilename allozierst, wird nirgends wieder freigegeben, oder? Das sieht mir nicht ganz sauber aus...
Ja, den Speicher muß das Hauptprogramm selber wieder freigeben (durch ein "free(leetfile);" irgendwo weiter unten im Text) - die Funktion selber kann das nicht machen, weil sie den Speicher ja nach außen übergeben will.
-
Ja, in meinem Programm ist schon ein free() vorhanden, keine Sorge
.
War ja nur ein kleiner Ausschnitt.
Danke für die Antworten
!