Segmentation Fault



  • und den Rückgabewert von malloc soll man nicht casten!

    Klär mich doch bitte mal auf, bisher habe ich das auch immer so gemacht.
    Und wenn ich das richtig verstehe liefert malloc doch einen Pointer vom
    Typ void zurück, der dann in den entsprechenden Datentyp gecastet werden
    muß, oder etwa nicht?

    GreetZ

    ReSeT



  • ne muss er nicht.

    Ein void* ist ein universal Pointer!

    den return wert von malloc casten ist zB hier toedlich:

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
      char* buffer=(char*)malloc(20);
      strcpy(buffer,"Hallo Welt!");
      printf("%s",buffer);
      free(buffer);
      return 0;
    }
    

    Na, wer findet den Fehler?



  • Original erstellt von Shade Of Mine:
    ...
    Na, wer findet den Fehler?

    Welchen Fehler .... ? in Deinem Programm läuft, dadurch dass du malloc() 'richtig' verwendest, alles korrekt ab. Tatsächlich gibt's nur auf den Maschinen einen Fehler, deren interne Repräsentation eines 'int'-Wertes von der eines Pointers abweicht.



  • Jetzt hätte ich dann doch gerne eine Erklärung 😃

    Also ich kann auch keinen Fehler entdecken.



  • In dem Programm ist durchaus ein Fehler drin. Durch den cast des malloc() wird er aber dummerweise versteckt. Das ist der Grund, warum der cast weggelassen werden sollte.

    Versuche mal das Programm, ohne cast mit einem C-Compiler zu übersetzen, und du bekommst eine Warnung, dass ein int in einen char*-Zeiger konvertiert wurde. Jetzt hast Du einen Anhaltpunkt :).

    [ Dieser Beitrag wurde am 20.12.2002 um 11:38 Uhr von mady editiert. ]



  • Also ich fasse mal zusammen:

    Offenbar liefert malloc() bei Erfolg einen int zurück.

    Dieser Int-Wert müsste ja der Adresse des Anfangs des allozierten
    Speichers entsprechen, richtig?

    Auf der einen Seite darf ich nicht casten, lasse ich das aber,
    beschwert sich der Compiler. Wie ist es also dann richtig?

    Ich muß jetzt also feststellen, daß ich grundlegende Dinge nicht
    verstanden habe.

    Könntet Ihr mir das mal etwas ausführlicher erklären?



  • Original erstellt von ReSeT:
    **
    Offenbar liefert malloc() bei Erfolg einen int zurück.
    **

    Nein, malloc liefert einen 'void*'. In C89 hat aber jede Funktion, die keine Deklaration und keinen Prototyp hat automatisch den Rückgabewert 'int'. Wenn nun ein void* fehlerfrei in einen int und zurück umgewandelt werden kann, ist das ein Problem. Auf 'normalen' Rechnern hast Du das Problem (leider) nicht, darum wird dieser Fehler oft gemacht.

    Shade: Im Zweifel: Dereferenzieren eines Nullzeigers ;-).



  • ich versteh' trotzdem nicht, wo der Fehler in Shades Programm sein soll
    und wie es in diesem Falle richtig auszusehen hat.



  • Original erstellt von ReSeT:
    ich versteh' trotzdem nicht, wo der Fehler in Shades Programm sein soll
    und wie es in diesem Falle richtig auszusehen hat.

    Es gibt keinen Prototypen für malloc() & Co, weil <stdlib.h> fehlt. Binde mal diese Datei mit ein, und mach' den cast weg, dann gibt's auch keine Warnung mehr ...



  • Also, es funktioniert so, wie von Dir beschrieben. Kann ich jetz also davon
    ausgehen, das in den meisten C-Büchern die Angaben bezüglich malloc()
    schlichtweg falsch sind und nie gecastet werden muß?



  • Original erstellt von ReSeT:
    Also, es funktioniert so, wie von Dir beschrieben. Kann ich jetz also davon
    ausgehen, das in den meisten C-Büchern die Angaben bezüglich malloc()
    schlichtweg falsch sind und nie gecastet werden muß?

    Treffer! Leider gibt's zu viele Unterlagen, wo der (cast) stillschweigend akzeptiert oder - schlimmer - empfohlen wird. Ein cast kann sinnvoll sein, wenn das Programm einmal nach C++ konvertiert wird. Ein cast sollte nur dann (in C) verwendet werden, wenn der Programmierer genau bescheid weiß, was er da eigentlich tut.



  • Original erstellt von ReSeT:
    Also, es funktioniert so, wie von Dir beschrieben. Kann ich jetz also davon
    ausgehen, das in den meisten C-Büchern die Angaben bezüglich malloc()
    schlichtweg falsch sind und nie gecastet werden muß?

    Jep.
    Der einzige Grund warum man bei malloc casten darf ist der, dass man C++ kompatibel bleiben will - aber dann schreibt man sowieso ein paar Sachen anders!



  • Na gut, dann bin ich ja heute wieder etwas schlauer geworden.

    Dank euch beiden 😉


Anmelden zum Antworten