Überflüssiger Zeiger???



  • Hallo Leute...

    Dieses Stückchen Code, den ich gefunden habe, dient dazu den Inhalt eines Struct-Array in die richtig Reihenfolge zu bringen...

    void Sort(struct adres sort[], int nr){
    	int i, j;
    	struct adres *temp;
    
    	temp = malloc(sizeof(struct adres *));
    
    	if(NULL == temp){
    		printf("Es konnte kein Speicher reserviert werden!\n");
    		return;
    	}
    
    	for(i = 0; i < nr; i++){
    		for(j=i+1; j < nr; j++){
    			if(strcmp(sort[i].nname, sort[j].nname) > 0){
    				*temp = sort[j];
    				sort[j] = sort[i];
    				sort[i] = *temp;
    			}
    		}
    	}
    	printf("..... Sortiert!!\n\n");
    }
    

    Aber ist die Art, wie hier der Speicher für den Zeiger *temp alloziert wurde nicht doppelt gemoppelt?

    temp = malloc(sizeof(struct adres *));
    

    Das ist doch im Grunde nur ein Zeiger auf einem Zeiger, welcher letztendlich auf die Speicheradresse zeigt, oder irre ich mich da?

    Folgendes funktionierte genauso gut...

    temp = malloc(sizeof(struct adres));
    

    Es wird doch in beiden Fällen, wie benötig, nur Speicher für die Größe von einem "struct adres" reserviert, oder???



  • egens schrieb:

    Es wird doch in beiden Fällen, wie benötig, nur Speicher für die Größe von einem "struct adres" reserviert, oder???

    Nein. In der ersten Variante wird nur genug Speicher für einen Pointer reserviert, was normalerweise so 4 Byte sein dürften. Sobald das struct größer wird als ein Pointer, funktioniert das Ganze nicht mehr. Nur dein Variante (malloc(sizeof(struct addr))) funktioniert immer korrekt. Trotzdem ist die dynamische Speicherverwaltung hier fehl am Platz. Ein: struct addr tmp; wäre völlig ausreichend.



  • Den Speicher per malloc() anzufordern ist imho unnötig, stattdessen sollte auch ein struct adres temp; ausreichen.

    Ansonsten ist Zeile 5 grob falsch - du reservierst genug Speicher für einen Zeiger und versuchst dann später, dort einen kompletten struct reinzupacken. Ich weiß zwar nicht, wie der definiert ist, aber vermutlich dürfte er es in dem reservierten Speicher etwas eng haben. Und das kann üble Folgen für den Heap-Manager haben.



  • Ok, danke schonmal...

    Nur fürs Verständnis:

    temp = malloc(sizeof(struct adres));
    

    Das wäre richtig, ist aber für diese Funktion einfach überzogen, richtig?

    Das hier..

    temp = malloc(sizeof(struct adres *));
    

    ist doch im Grunde genauso zu verstehen wie das was ich hier schonmal Gefragt und mir mehr oder weniger auch beantwortet hatte... ???



  • egens schrieb:

    Ok, danke schonmal...

    Nur fürs Verständnis:

    temp = malloc(sizeof(struct adres));
    

    Das wäre richtig, ist aber für diese Funktion einfach überzogen, richtig?

    Nicht nur überzogen, sondern auch viel langsamer als eine lokale Variable.

    egens schrieb:

    Das hier..

    temp = malloc(sizeof(struct adres *));
    

    ist doch im Grunde genauso zu verstehen wie das was ich hier schonmal Gefragt und mir mehr oder weniger auch beantwortet hatte... ???

    Ehm.. ja.. mehr oder weniger^^
    Es wird halt Speicher in der Größe eines Pointers reserviert.


  • Mod

    Wenn schon malloc, dann richtig:

    foo = malloc( sizeof *foo );
    

Anmelden zum Antworten