lama007
OC Addicted
|
Hi, wodurch unterscheiden sich diese zwei Versionen: #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 );
}
Bearbeitet von lama007 am 08.02.2009, 19:23
|
aNtraXx
trailer park king
|
Das unterscheidet sich darin, dass V2 dynamisch ist und du auch später selbst dafür zuständig bist den Speicherbereich freizugeben (mittels free).
|
semteX
begehrt die rostschaufel
|
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..)
|
aNtraXx
trailer park king
|
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..) Ja ist richtig. Das hab ich durch "dynamisch" eigentlich ausdrücken wollen.
|
that
Hoffnungsloser Optimist
|
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.
|
that
Hoffnungsloser Optimist
|
Hier V2 auf "richtig": #include <string.h>
....
char *z2 = malloc(count);
strcpy(z2, "123456789");
printf("%s\n", z2);
free(z2);
|
PuhBär
Schau ned so genau
|
Der dynamisch reservierte Bereich vom Heap wird weder verwendet noch freigegeben. Viel schlimmer noch, es kann gar nicht mehr freigegeben werden, weil die ursprüngliche Addresse des allozierten Blocks mit der Addresse des constant strings überschrieben wird -> Memory Leak von 10Byte! Strings in einen Buffer kopieren würd ich strcpy oder strdup verwenden ... Edith: Owned by that
|
lama007
OC Addicted
|
thx, wieder ein bisschen klüger.
|