Warum klappt malloc(0)?



  • Nabend!

    Habe eben kurze Frage. Warum funktioniert dieser Code? Habe ihn mit dem GCC kompiliert.

    #include <stdio.h>
    #include <stdlib.h>
    
    struct point{
    	float x;
    	float y;
    };
    
    int main(){
    	struct point *koordinaten;
    
    	koordinaten =  malloc(0);
    
    	koordinaten->x = 1.2;
    	koordinaten->y = 3.56;
    
    	printf("koordinaten.x = %f\nkoordinaten.y = %f\n", koordinaten->x, koordinaten->y);
    
    	free(koordinaten);
    
    	return 0;
    }
    

    Die Werte von "koordinaten" werden zugewiesen und richtig angezeigt. Weiß jemand warum?

    Danke!
    MfG
    Danke



  • soweit ich weiß bekommst nur ein char... wenns geht dann glück gehabt.



  • kann gut sein das ein malloc(1) dir mehr reserviert weil der kleinste freie block eben größer als 1 ist (dann bekommst idr. bei realloc auch keine neue adresse). darauf sollte man sich aber nicht verlassen...



  • malloc(0) wird im Anhang J des C99-Standards explizit unter "J.1 Unspecified behavior" geführt:

    ISO/IEC 9899:1999 J.1 schrieb:

    J.1 Unspecified behavior

    The following are unspecified:

    (...)

    - The amount of storage allocated by a successful call to the calloc, malloc, or realloc function when 0 bytes was requested (7.20.3).

    (...)

    Mir anderen Worten: Dass das bei dir funktioniert, ist reiner Zufall, und du solltest dich nicht darauf verlassen, dass es irgendwo anders funktioniert, dass es immer bei dir funktioniert, oder dass es mit einer zukünftigen Compilerversion immer noch funktionieren wird.



  • Also, daß das free() nicht auf die Nase fliegt, ist klar:

    If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().

    (aus man.cx).
    Aber warum die Zuweisung hinhaut, macht mich stutzen. Hab' hier grad ein LCC- Derivat am Compilieren, der liefert tatsächlich auch einen gültigen Pointer aus.



  • c99 😮 sollt ich doch nochmal anschauen 😞

    gcc's malloc implementation setzt den ersten parameter bei übergabe von 0 auf 1



  • Dann hatte ich wohl reines Glück. 🙂

    Kann mir jemand sagen was hier falsch ist?

    #include <stdio.h>
    #include <stdlib.h>
    
    struct point{
    	float x;
    	float y;
    };
    
    int main()
    {
    	struct point *koordinaten;
    
    	(struct point*) koordinaten = (struct point*) malloc(sizeof(struct point)); //"struct.c:13:69: Fehler: Als linker Operand einer Zuweisung wird L-Wert erfordert"
    
    	koordinaten->x = 1.2;
    	koordinaten->y = 3.56;
    
    	printf("koordinaten.x = %f\nkoordinaten.y = %f\n", koordinaten->x, koordinaten->y);
    
    	free(koordinaten);
    
    	return 0;
    }
    

    Danke!



  • Lass die Casts weg, insbesondere den auf der linken Seite:

    koordinaten = malloc(sizeof(struct point));
    

    Das Problem, in das du läufst, ist, dass

    (struct point*) koordinaten
    

    ein R-Wert ist, dem nichts zugewiesen werden kann.



  • Danke schrieb:

    Dann hatte ich wohl reines Glück. 🙂

    Kann mir jemand sagen was hier falsch ist?

    #include <stdio.h>
    #include <stdlib.h>
    
    struct point{
    	float x;
    	float y;
    };
    
    int main()
    {
    	struct point *koordinaten;
    	
    	koordinaten = malloc(sizeof(struct point)); //"struct.c:13:69: Fehler: Als linker Operand einer Zuweisung wird L-Wert erfordert"
    	
    	
    
    	koordinaten->x = 1.2;
    	koordinaten->y = 3.56;
    
    	printf("koordinaten.x = %f\nkoordinaten.y = %f\n", koordinaten->x, koordinaten->y);
    
    	free(koordinaten);
    	
    	return 0;
    }
    

    Danke!

    Ohne die casts geht's bei mir. Im Zweifelsfall erstmal hier nachlesen!.



  • pointercrash() schrieb:

    Ohne die casts geht's bei mir. Im Zweifelsfall erstmal hier nachlesen!.

    Vielen Dank, funktioniert!


Anmelden zum Antworten