malloc funzt net?
-
Hi Leute! Ich habe mir heute eine Funktion zum sicheren erstellen von Speicherbereichen für Strings geschrieben:
int safeCreateString(char* target, const char* source) { unsigned int length = strlen(source); target = (char*)malloc(length+1); if(!target) return -1; sprintf(target, "%s", source); return length; }
Der als target angegebene String enthält danach aber nur wirres zeugs, nicht aber den string aus source...
-
Deine Funktion wird nicht das machen, was sie eigentlich tun soll, da du die Adresse des reservierten Speicherbereichs in einem LOKALEN Zeiger speicherst, den es nach Beendigung der Funktion nicht mehr gibt.
Deine FUnktion sollte in etwa so aussehen (ungetestet):
int safeCreateString(char** target, const char* source) { unsigned int length = strlen(source); *target = (char*)malloc(length+1); if(!target) return -1; sprintf(*target, "%s", source); return length; }
-
Danke! Ich dachte immer pointer ist pointer...
-
Nein, es gibt auch Pointer auf Pointer und Pointer auf Pointer auf Pointer usw
-
Pointer ist Pointer - aber man kann auch eine Kopie von einem Pointer anlegen. Denn ein Pointer zeigt auf ein Objekt. Die Adresse dieses Objektes ist der Wert des Pointers. Und wenn wir diesen Wert (also die Adresse des Objektes) by value uebergeben, dann fuehrt ein aendern der Adresse natuerlich nicht zum gewuenschten Erfolg.
-
unsigned int length = strlen(source);
seid ihr sicher das das so richtig ist?
bei diesem funktionskopf?
int safeCreateString(char** target, const char source
hmm....
bye
tt
-
Was sollte denn Deiner Meinung nach anders sein?
-
Was sollte denn Deiner Meinung nach anders sein?
das die länge des char arrays mit als parameter übergeben wird
da ich davon ausgehe das sizeof(source) nur die größes eines pointers zurück gibt, würde man das vielleicht so char source[] übergeben sollte es gehen, da so eine komplette kopie des strings aufm stack gemacht wird
tschööö
tt
-
char* und char[] sind in einem Funktionskopf das gleiche.
Deinen Punkt mit sizeof verstehe ich allerdings nicht.
-
hmm..dann hab ich da sicher was verwechselt...ich für meinen teil bin da immer ziemlich misstrauisch und übergebe halt immer die anzahl mit über die parameterliste, vielleicht gewohnheit...irgendwelche gründe wirds sicher gehabt haben
tschööö
tt
-
Performance Gruende hat es, wenn du die Laenge an die Funktion uebergibst - denn dann muss kein strlen() ausgefuehrt werden, wenn du die Laenge schon kennst. Und wenn du sie nicht kennst, kann man ja strlen() problemlos selber aufrufern.
Aber dennoch ist der obrige Code OK.
-
jo der is ok..ich glaub ich hab strlen mit sizeof verwechselt
tschööö
tt
-
Aber dennoch ist der obrige Code OK.
Nope.
if(!target) return -1;
sollte wohl eher
if (!*target) return -1;
heißen
mfg
-
<edit>Muell</edit>
-
gast schrieb:
Aber dennoch ist der obrige Code OK.
Nope.
Stimmt. Du hast recht.