malloc
-
Hi
Ich benutze sprintf() um ein String nach buffer zu erstellen.
char *buffer; sprintf(buffer, "Text %s", string);
Nun muss ich aber erstmal mit malloc den Speicher setzen aber kapier ich das nicht so ganz.
*buffer = malloc(6 + strlen(string));
Ist das so richtig? Also "Text " hat 5 zeichen + '\0' + die anzahl der zeichen von string? Wenn das falsch ist wie muss es richtig aussehen?
-
^^ strlen("Text") + 1 byte für den leerraum + strlen(string) + 1 byte für die abschliessende 0 sollten reichen. vielleicht kennst du auch die maximale länge, die 'string' annehmen kann, dann kannste u.u. ganz auf malloc verzichten (*auaa* nwp2, nicht gleich schlagen).
-
Hallo,
frage zu malloc schrieb:
Ist das so richtig?
nein, entweder gleich bei der Initialisierung:
char* s = "Text"; char* buf = malloc(strlen(s)+1);
oder später irgendwo im Code:
buf = malloc(strlen(s)+1); // Ohne Sternchen.
Gruß,
B.B.
-
Hmm.
char *formatstring = "Text %s"; char *buffer = malloc(strlen(formatstring)-2+strlen(string)+1); sprintf(buffer, formatstring, string);
So richtig gefällt mir das aber auch noch nicht.
strlen(formatstring)-2 weil du die Länge des formatstrings willst, aber das %s wird ersetzt also zählt es nicht, deshalb -2. Und das +1 wegen '\0'.
Jedenfalls solltest du vermeiden Zahlen bei malloc reinzuschreiben und stattdessen lieber strlen benutzen damit du einfach den String ändern kannst ohne an anderer Stelle was ändern zu müssen. Ich frage mich ob es ein fstrlen gibt. Also quasi eine strlen-Version die Formatstrings akzeptiert, sodass man sowas machen kann:char *teststring = "Test"; char *buffer = malloc(fstrlen("Mein Teststring \"%s\" hat %d Zeichen", teststring, strlen(teststring))+1); sprintf(buffer, "Mein Teststring \"%s\" hat %d Zeichen", teststring, strlen(teststring));
fstrlen würde dann die Zeichen + die Parameter in Zeichen zählen. Ich hoffe mal das ist verständlich.
Eigentlich kann man sich das selbst bauen indem man sprintf in die Wallachei printen lässt und den Rückgabewert von sprintf zurückgibt, aber irgendwie ist mir das zu kompliziert. Mit stdarg die Parameter sammeln, vorher Parameteranzahl zählen und dann variabel übergeben ...
Wahrscheinlich sollte man sich sprintf nehmen und nur das eigentliche Schreiben des Strings rauslöschen und schon hat man fstrlenHmm, war irgendwie leicht übers Ziel hinausgeschossen. Die kurze Antwort ist "Es ist schon richtig so wie du das gemacht hast, der Stil hingegen ist fragwürdig".
Edit: Ach ja, ohne Sternchen und vor dem sprintf.
-
Big Brother schrieb:
gleich bei der Initialisierung
Als ob ich das nicht vorhätte..
nwp2 schrieb:
Ich frage mich ob es ein fstrlen gibt.
Sowas bräuchte ich, aber Lust es zu schreiben, habe ich keine.
Zählen kann ich und der Code ist eh was ganz kleines also bleibe ich dabei.nwp2 schrieb:
Die kurze Antwort ist "Es ist schon richtig so wie du das gemacht hast, der Stil hingegen ist fragwürdig".
Edit: Ach ja, ohne Sternchen und vor dem sprintf.Das war ja NUR ALS BEISPIEL. Mein Code würde so aussehen:
char *buffer = malloc(6 + strlen(string)); sprintf(buffer, "Text %s", string); //... free(buffer);
-
frage zu malloc schrieb:
Das war ja NUR ALS BEISPIEL. Mein Code würde so aussehen:
char *buffer = malloc(6 + strlen(string)); sprintf(buffer, "Text %s", string); //... free(buffer);
vergiss nicht, nach dem 'malloc' zu testen ob's überhaupt geklappt hat (buffer darf nicht 0 sein). und wie gesagt, wenn du's nur temporär brauchst und die maximallänge von 'string' kennst, ist vielleicht malloc garnicht nötig.
-
also ich denke ja dass muüsste man so machen oder?:
char*text=(char*)malloc(strlen(andererText)*char);
-
Wenn überhaupt dann:
char*text=(char*)malloc(strlen(andererText)*[b]sizeof(char)[/b]);
Aber besser wäre es so:
char *text = malloc(strlen(andererText) + 1);
Es ist nämlich imho kein Cast notwendig. Außerdem ist char immer 1 Byte groß. Und du musst noch + 1 rechnen für das Terminierungszeichen.
-
frage zu malloc schrieb:
Mein Code würde so aussehen:
char *buffer = malloc(6 + strlen(string)); sprintf(buffer, "Text %s", string); //... free(buffer);
So gehts.