solved: [C] malloc

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/solved_c_malloc_204377/page_1 - zur Vollversion wechseln!


lama007 schrieb am 01.02.2009 um 10:34

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 );  	
} 


aNtraXx schrieb am 01.02.2009 um 10:41

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 schrieb am 01.02.2009 um 11:13

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 schrieb am 01.02.2009 um 11:28

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 schrieb am 01.02.2009 um 11:36

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 schrieb am 01.02.2009 um 11:49

Hier V2 auf "richtig":

Code:
#include <string.h>

....

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


PuhBär schrieb am 01.02.2009 um 11:52

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 schrieb am 01.02.2009 um 14:43

thx, wieder ein bisschen klüger.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025