"We are back" « oc.at

solved: [C] malloc

lama007 01.02.2009 - 10:34 1964 7 Thread rating
Posts

lama007

OC Addicted
Avatar
Registered: Mar 2002
Location: Austria
Posts: 851
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 );  	
} 
Bearbeitet von lama007 am 08.02.2009, 19:23

aNtraXx

trailer park king
Avatar
Registered: Apr 2002
Location: Linz
Posts: 6907
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
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14699
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
Avatar
Registered: Apr 2002
Location: Linz
Posts: 6907
Zitat von semteX
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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Hier V2 auf "richtig":

Code:
#include <string.h>

....

char *z2 = malloc(count);
strcpy(z2, "123456789");
printf("%s\n", z2);
free(z2);

PuhBär

Schau ned so genau
Avatar
Registered: Sep 2002
Location: .
Posts: 1240
Zitat von that
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
Avatar
Registered: Mar 2002
Location: Austria
Posts: 851
thx, wieder ein bisschen klüger.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz