URL: https://www.overclockers.at/coding-stuff/solved_c_malloc_204377/page_1 - zur Vollversion wechseln!
Hi,
wodurch unterscheiden sich diese zwei Versionen:
Code:#include <stdio.h> #include <stdlib.h> int main( void ) { int count = 10; /* Version 1 */ char *z1; char string[count]; z1 = string; z1 = "123456789"; printf( "%s\n", z1 ); /* Version 2 */ char *z2; z2 = malloc( sizeof( char ) * count ); z2 = "123456789"; printf( "%s\n", z2 ); return( 0 ); }
Das unterscheidet sich darin, dass V2 dynamisch ist und du auch später selbst dafür zuständig bist den Speicherbereich freizugeben (mittels free).
der größere unterschied ist allerdings der ort, wo der speicher allokiert wird.
v1 allokiert, wenn ich ned grad komplett daneben lieg, am stack, v2 allokiert den speicher am Heap. das ist vor allem bei großen strukturen interessant (im sinne von: der stack is beschränkter..)
Zitat von semteXder größere unterschied ist allerdings der ort, wo der speicher allokiert wird.
v1 allokiert, wenn ich ned grad komplett daneben lieg, am stack, v2 allokiert den speicher am Heap. das ist vor allem bei großen strukturen interessant (im sinne von: der stack is beschränkter..)
Der Unterschied ist, dass beide Versionen auf verschiedene Arten falsch sind.
Version 1 definiert einen Zeiger z1 auf ein char sowie ein Array string von 10 chars. Beide liegen auf dem Stack. Dann wird der Zeiger z1 auf die Adresse des ersten Zeichens von string gesetzt, anschließend auf die Adresse des ersten Zeichens der Konstante "123456789". Diese wird dann ausgegeben. Das Array "string" wird in dem ganzen Prozess nie verändert und könnte auch weggelassen werden.
Version 2 definiert einen Zeiger z2 auf ein char, ebenfalls auf dem Stack. Dann wird vom Heap ein Bereich von 10 chars reserviert (wobei sizeof(char) laut C-Standard *immer* 1 ist), und z2 auf die Adresse des ersten Zeichens dieses Bereichs gesetzt. Anschließend wird z2 wieder umgesetzt auf die Adresse des ersten Zeichens der Konstante "123456789". Diese wird dann ausgegeben. Der dynamisch reservierte Bereich vom Heap wird weder verwendet noch freigegeben.
Hier V2 auf "richtig":
Code:#include <string.h> .... char *z2 = malloc(count); strcpy(z2, "123456789"); printf("%s\n", z2); free(z2);
Zitat von thatDer dynamisch reservierte Bereich vom Heap wird weder verwendet noch freigegeben.
thx, wieder ein bisschen klüger.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025