anwendung: malloc und free



  • Hi,

    innerhalb einer funktion verwende ich malloc.

    void Fct1 (unsigned short **id)
    {
       unsigned short *optr = (unsigned short *)0; 
       *id = (unsigned short *) malloc (size * sizeof(unsigned short)); 
       optr = *id;
    }
    

    meine main-function sieht so aus:

    struct _obj {
    
      unsigned short *id; 
    };  
    struct _obj *obj; 
    
    int main(void)
    {
      unsigned short *id = (unsigned short *)0; 
    
      //functionsaufruf
      Fct1(&id); 
    
      obj->ID = id;     
    
      //free() jetzt anwenden
    
      free(obj->id); 
      obj->id = NULL; 
    }
    

    Ist die Anwendung von malloc und free so richtig?

    Hans-Im-Glück



  • in deiner funktion Fct1 verwendest du size, obwohl es das nicht gibt. der rückgabewert von malloc muss nicht gecastet werden. die variable oprt kannst du weglassen in deinem beispiel. 0 muss auch nicht gecastet werden. verwende lieber NULL zu finden in stdlib.h. der rest ist richtig.



  • Hi Bruder !
    Die Verwendung von free und malloc ist soweit ok,
    aber das Casten von malloc ist in C nicht nötig.

    Du benutzst einen Zeiger auf eine Struktur, für die es keinen Speicherplatz gibt.
    Das würde an der Stelle obj->ID = id; einen Crash geben, wenn
    deine Struktur den member ID hätte.
    Deine Struktur hat keinen ID member, sondern id.

    Wozu soll eigentlich unsigned short *optr in Fct1 gut sein ?
    Du solltest den Rückgabewert von malloc prüfen, es kann auch mal ein NULL zurückkommen.
    Spendier doch für Fct1 einen Rückgabewert, über den sich der Erfolg von malloc prüfen lässt und pack doch size ( hier n ) auch gleich mit in die Parameterliste:

    int Fct1( unsigned short **id, unsigned n )
    {
       if( NULL == ( *id = malloc( n * sizeof(unsigned short))))
    		return 1;
       return 0;
    } 	
    
    struct Object
    {
      unsigned short *id;
    };  
    
    int main()
    {
    	struct Object obj = {0};
    	unsigned n = 10, i;
    
    	if ( Fct1( &obj.id, n ) )
    	{
    		puts( "Out of memory." );
    		return 1;
    	}
    
    	for ( i = 0; i<n; i++ )
    	{
    		obj.id[i] = i;  
     		printf( "%hd", obj.id[i] );
    	}
    
    	free(obj.id);
        return 0;
    }
    

Anmelden zum Antworten