Segmentation Fault



  • 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