Verstaendnis fuer Speichersicherheit in C geht nich
-
Hallo,
Angenommen ich habe einen char* names "str" auf ein fuer 80 Zeichen allokiertes Array (inclusive '\0'). In einer Funktion main() liegt der Zeiger und wird der Speicher allokiert. Dann wird "str" an eine Funktion func(char*) uebergeben.- Ich will in "str" hineinschreiben - hier muss ich die Laenge 80 mituebergeben da nur 79 Zeichen hineingeschrieben werden duerfen (und ein '\0'), weil main() auch nur ein 80 Zeichen-Array "str" behandelt und auch nur fuer 80 Zeichen Speicher allokiert worden ist.
- Ich will aus "str" auslesen - hier reicht der Zeiger, da bis '\0' ausgelesen wird, die Laenge (ohne '\0') kann ich mit strlen() dann auch in func() ermitteln.
Fragen:
1. Ist obiges Vorgehen sicher, oder sollte man die Laenge in beiden Faellen uebergeben - Reicht ein gesetztes '\0' als Laengenbegrenzung aus, bzw die ueberpruefung mit strlen() wenn ich nur die Laenge des beschriebenen Strings haben will oder nicht?2. Fuer die Gesamtlaenge des allokierten Speichers erreiche ich ueber sizeof(str)/sizeof(char) - somit auch in func(), oder?
3. Wenn ich in func() nun weiteren Speicher zu "str" dazuallokiere, bleibt mir dieser in main() dann erhalten oder steht dieser nur in func() local zur Verfuegung?
TIA
-
-
Solange alle beteiligten Funktionen darauf achten, den Null-Terminator anzuhängen, dürfte das Vorgehen ausreichen. Auf der sicheren Seite bist du, wenn du trotzdem die Größe mitgibst.
-
Nein - diese Konstruktion funktioniert nur, wenn du ein echtes Array in der Hand hast (die Funktionen, denen du deinen String übergibst, bekommen aber nur einen Zeiger auf ein Array).
-
Der neu allokierte Speicher ist nur in der Funktion gültig (die arbeitet mit einer Kopie des Zeigers, den main() ihr übergeben hat) - und was noch schlimmer ist, mit realloc() könntest du dir auch den Speicher pulverisieren, den die main() angefordert hat. Wenn du auf der sicheren Seite sein willst, mußt du den char-Zeiger "per ref" übergeben:
int func(char** pStr,int* pSize)//Zeiger auf char* { ... if(...) { *pStr = realloc(*pStr,new_size); *pSize=new_size; } ... } int main() { int data_len = //get the basic length char* data = malloc(data_len); func(&data,&data_len); ... }
-