gcc: malloc ohne cast



  • moin

    Im ANSI C Forum ließt man ja öfter mal, daß man die Rückgabe von malloc nicht zu casten braucht.

    Beispiel

    int main(void)
    {
      char *ptr;
      ptr = malloc(123);
      return 0;
    }
    

    gcc meint dazu:
    warning: assignment makes pointer from integer without a cast

    ok, ist nur eine Warnung, aber unterstützt der gcc den Standard nicht komplett?



  • Die Warnung bekommst Du nicht, weil Du den cast vergessen hast, sondern die <stdlib.h> nicht inkludiert wurde.

    Genau genommen ist das exakt der Grund, weshalb der cast gefährlich ist.



  • Gut, mit stdlib.h gibts kein warning mehr, aber warum ist der cast gefährlich?



  • Wenn <stdlib.h> fehlt, dann ist der Prototyp von malloc() & Co unbekannt. Wenn in C89 für eine Funktion der Prototyp unbekannt ist, wird vom Compiler automatisch einer erzeugt. Dieser Prototyp hat dann die folgende Form:

    extern int funktion();
    

    Dass hat jetzt Auswirkungen:
    1. werden Aufrufe der Form malloc("Hallo", "Welt"); als richtig akzeptiert.
    2. Als Rückgabewert wird 'int' angenommen. Nachdem ein 'int' was anderes ist, als ein 'char*' kommt's zur Warnung. ABER: Nirgends steht geschrieben, dass ein Zeiger vom Typ 'void*' (das eigentliche Ergebnis von malloc()) genauso im Speicher abgelegt ist, wie ein 'int'.

    Wenn gecastet wird, bedeutet das, dass der Programmierer über diesen Umstand bescheid weiß -> der Compiler gibt keine Fehlermeldung.



  • dann ist doch aber das casten des Rückgabewertes von malloc nicht gefährlich, allenfalls überflüssig?! gefährlich wäre nur das Weglassen des casts, wenn man gleichzeitig stdlib.h nicht included?



  • Original erstellt von stahl:
    dann ist doch aber das casten des Rückgabewertes von malloc nicht gefährlich, allenfalls überflüssig?! gefährlich wäre nur das Weglassen des casts, wenn man gleichzeitig stdlib.h nicht included?

    Ganz genau!



  • * ups *

    [ Dieser Beitrag wurde am 20.10.2002 um 12:45 Uhr von elise editiert. ]



  • Original erstellt von stahl:
    gefährlich wäre nur das Weglassen des casts, wenn man gleichzeitig stdlib.h nicht included?

    Nein, gefaehrlich waere das casten, wenn man die stdlib.h nicht einbindet.

    Sollte die stdlib.h eingebunden sein, dann ist ein cast nur ueberfluessig und unschoen. Sollte die stdlib.h fehlen, ist der cast gefaehrlich.

    Beim weglassen des casts und nicht einbinden der stdlib.h kommt eine Compiler Warnung - beim casten kommt diese warnung nicht!



  • ich könnte mich jetzt damit zufrieden geben und in zukunft einfach mit stdlib.h und ohne cast glücklich werden, aber eines noch:

    // ohne <stdlib.h>
    char *ptr;
    ptr = (char*)malloc(123)
    

    was ist daran gefährlich? der compiler wird damit ja auch glücklich?!



  • naja ... Wenn Du mein Posting oben nochmal liest, ... egal ... 😉

    Also: Du castest einen Rückgabewert 'int' in einen 'char*'. Jetzt kann ein int im Speicher anders abgelegt sein, wie ein Pointer. Und genau dann hast Du ein Problem damit. Auf x86-PC's sollte das IMHO funktionieren. Solche Fehler sind schwer zu finden.

    Und: Wenn die stdlib.h nicht inkludiert wird, dann werden auch Aufrufe der Form

    malloc("123");
    

    akzeptiert.



  • Original erstellt von mady:
    Solche Fehler sind schwer zu finden.

    warum kann der compiler nicht auch bei sowas warnen?!

    im moment hab ich wohl generell ein problem mit dem casten.
    jedenfalls danke soweit.



  • Original erstellt von stahl:
    warum kann der compiler nicht auch bei sowas warnen?!
    ....

    Ein cast in C bedeutet immer, dass der Programmierer genauestens über diese Problematik (u.a.) bescheid weiß. Deshalb bekommst Du keine Warnung.



  • er kann warnen, weil du eine Funktion ohne Prototyp benutzt. Mit -Wall tut er das auch.



  • ja, bewahrt mich aber leider auch nicht vor "unglücklichen" casts.


Anmelden zum Antworten