[gelöst] Verständnisfrage zu malloc & co
-
Liebes Forum,
ich bin auch gerade dabei die Sprache C zu lernen und hänge gerade bei malloc & co.
Das folgende Programm besteht u.a aus einer Funktion die einen Pointer auf ein char-array entgegennimmt und diesen String dann verdoppelt wieder zurückgibt.
Hierzu soll für den doppelten String Speicher auf dem Heap erzeugt werden.Das fett gedruckte wurde von mir ergänzt, der Rest war vorgegeben. Ich bin mir nur nicht sicher ob ich die richtige "Menge" auf dem Heap reserviert habe und ob das mit dem free so in main() stimmt.
Aber ich dachte mir, dass ich den Speicher ja erst wieder freigeben sollte, wenn der String mit printf ausgegeben wurde.#include<stdlib.h> #include<stdio.h> #include<string.h> char* StringDoubler(char *str) { int i = 0; int l = strlen (str); char *doubleStr = NULL; [b] doubleStr = (char *) malloc((2*l) + 1); for (i = 0; i < 2; i++) { doubleStr = strcat(doubleStr, str); } return doubleStr[/b]; } int main ( void) { char str[] = "Klausur"; char *dStr = StringDoubler(str); printf("Zeichenkette: %s --- doppelte Zeichenkette: %s\n", str, dStr); [b] free(dStr);[/b] return 0; }
Danke euch schonmal und noch einen schönen Sonntag
Grüße
-
Hallo tagedieb,
Dein Code ist sehr richtig, sowohl das Allokieren als auch das Freigeben. Der 'doubleStr' sollte allerdings geleert werden, bevor man weitere Strings an ihn hängt, da man sonst eventuell über den Speicherbereich hinaus schreibt.
doubleStr = (char *) malloc((2*l) + 1); strncpy (doubleStr, "", 2 * l + 1); /* String leeren */ for (i = 0; i < 2; i++) { doubleStr = strcat(doubleStr, str); }
Gez. monstermunchkin
-
Danke Dir,
freut mich dass es soweit stimmt. Manche Sachen kann man eben alleine nicht überprüfen, gerade weil das Programm ja auch ohne malloc laufen würde.Schönen Abend noch.
Grüße
-
monstermunchkin schrieb:
Hallo tagedieb,
Dein Code ist sehr richtig, sowohl das Allokieren als auch das Freigeben. Der 'doubleStr' sollte allerdings geleert werden, bevor man weitere Strings an ihn hängt, da man sonst eventuell über den Speicherbereich hinaus schreibt.
Richtig erkannt ( auch wenn dein strncpy-Aufruf nicht das macht, was du dir wohl erhoffst
) , mann könnte aber auch strcpy statt strcat nehmen - dann kann man sich das leeren sparen:
strcpy(doubleStr,str); strcpy(doubleStr + l ,str);
Weitere fällt mir auf:
- Du solltest explizit überprüfen, ob malloc auch geklappt hat und im Fehlerfall diese der aufrufenden Prozedur mitteilen ( etwa indem du selbst NULL zurückgibst anstatt einem gültigen Pointer)- Warum ist l als int definiert? strlen gibt size_t zurück, und malloc erwartetet ebenfalls einen size_t Parameter. Da liegt es nahe auch l als size_t zu definieren.
- Theoretisch könnte 2 * l größer als SIZE_MAX/INT_MAX sein. Auch dann schreibst du in Speicher, der dir nicht gehört. Für eine saubere Lösung musst du auch diesen Fall abfangen.
-
nochKeinen schrieb:
auch wenn dein strncpy-Aufruf nicht das macht, was du dir wohl erhoffst
Was erhoffe ich mir denn deiner Meinung nach?
-
monstermunchkin schrieb:
nochKeinen schrieb:
auch wenn dein strncpy-Aufruf nicht das macht, was du dir wohl erhoffst
Was erhoffe ich mir denn deiner Meinung nach?
Stimmt, ich weiß ja gar nicht, was du machen wolltest.
Deine Lösung überschreibt den kompletten Speicher mit Nullen. Es reicht aber aus, den Anfang des Array auf Null zu setzen,...