Warum Segmentation fault?



  • Für mich ist sinnfreier, dass er newJob als lokale Variable deklariert. Es sollte ein Pointer sein ( Job *newJob = malloc(sizeof newJob); ).

    Im Übrigen empfehle ich -Wall -Wextra -ansi -pedantic -g -ggdb3 . Dann kann er es nämlich auch noch gleich selber debuggen.

    @fritten_fritz: (*current).runtime ist äquivalent zu current->runtime. Nimm lieber zweiteres.



  • Okay, danke für den Input. Ich hab grad erst mit C angefangen und komme mit der Speicherverwaltung noch nicht ganz klar. Ich bin viel zu verwöhnt durch PHP und Java.
    Das Programm läuft nun auch wie gewünscht. Aber da wir grad dabei sind, zwei Warnings vom Compiler verstehe ich nicht.

    u2_3.c: In function ‘insertJob’:
    u2_3.c:19: warning: ISO C90 forbids mixed declarations and code
    u2_3.c: In function ‘main’:
    u2_3.c:66: warning: ISO C90 forbids mixed declarations and code
    

    Das betrifft die folgenden Zeilen:

    19: Job *newJob = (Job *)malloc(sizeof(Job));
    
    66: Job *current = queue;
    

    Könnt ihr mir das auch noch grad erklären?


  • Mod

    In C nach 1989er Standard war es nicht erlaubt, Variablen mitten im Code zu deklarieren, da musste alles ganz am Anfang der Funktion stehen. Mit dem Standard von 1999 ist dies jedoch offiziell erlaubt worden. Als jemand der sonst hauptsächlich C++ macht, sage ich, dass man das auch möglichst nutzen sollte, aber viele C-Benutzer der alten Schule sehen das ganz anders.
    Ist aber reine Geschmackssache und hat nicht direkt mit der Funktionsweise deines Programms zu tun.



  • SeppJ schrieb:

    der Funktion

    des Scopes 🤡


  • Mod

    cooky451 schrieb:

    SeppJ schrieb:

    der Funktion

    des Scopes 🤡

    Stimmt. Wobei ich bei den Leuten die gegen die lokale Deklaration sind naturgemäß auch selten die Benutzung von Scopes sehe 😃 .



  • Okay, danke zusammen. Jetzt bin ich erstmal bedient.

    Schönen Abend noch.



  • SeppJ schrieb:

    In C nach 1989er Standard war es nicht erlaubt, Variablen mitten im Code zu deklarieren, da musste alles ganz am Anfang der Funktion stehen. Mit dem Standard von 1999 ist dies jedoch offiziell erlaubt worden. Als jemand der sonst hauptsächlich C++ macht, sage ich, dass man das auch möglichst nutzen sollte, aber viele C-Benutzer der alten Schule sehen das ganz anders.
    Ist aber reine Geschmackssache und hat nicht direkt mit der Funktionsweise deines Programms zu tun.

    Es hat mit Lesbarkeit zu tun und dem Umstand, daß C99 nach über 10 Jahren nicht mehr als fragmentarisch in die C- Welt Einzug gehalten hat. Wegen so einem Käse Portabilität zu opfern, ist keine reine Geschmackssache mehr. "Sicher" ist C89.

    Die echte Geschmacksfrage, ob man wirklich mitten im Code deklarieren können sollte, stellt sich mir damit gar nicht mehr.



  • Mir war auch nie bewusst, dass das so dramatische Folgen hat, wenn man in ANSI-C (C89) eine Variable mitten im Code deklariert... Kann das zur Folge haben, dass es auf irgendwelchen Systemen nicht mehr kompilierbar ist, oder was?



  • So ist es.



  • Wieder was dazu gelernt. Man dankt 🙂


Anmelden zum Antworten