Der Ausgabe nachfolgende Programmstelle wirkt sich rückwirkend auf Ausgabe aus!?



  • Hallo,

    ich habe ein Problem mit einem C-Programm in der Shell und kann mir absolut nicht erklären wie es dazu kommt.

    Es geht um folgenden Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <errno.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/types.h>
    #define LAENGE 20;
    
    int main(int argc, char* argv[]){
    
        int base;
        char *endptr, *str;
        long val;
        key_t KEY;    
        int shm_id;
    /*  char *data; */
    
              str = argv[1];
              val = strtol(str,&endptr,base);
              printf("%lu\n",val);
    
              KEY = (val + 100000);
              shm_id = shmget(KEY, 10, 0660 | IPC_CREAT | IPC_EXCL);
              printf("check");
    /*       data = shmat(shm_id, NULL, 0);    */
    
    return 0;
    }
    

    Kompilieren tu ich mit "gcc -Wall - Werror -pedantic -o temp temp.c
    Ausführen wird mit ./temp 12345

    Wenn ich das Programm ausführe so wie es jetzt da steht, bekomme ich als Ausgabe folgendes:

    12345
    check

    Die Zahl ist der Wert der Variable val.

    Wenn ich nun aber die beiden auskommentierten Stellen wieder ins Programm mitaufnehme, kompiliere und es dann aufrufe bekomme das hier:

    0
    check

    Das heißt die Variable data oder die Funktion shmat wirkt sich irgendwie rückwirkend auf das Programm aus. Aber wie kann das sein? Ich dachte immer C-Programme werden von oben nach unten abgearbeitet. Das einzige das sich vor der Ausgabe von val ändert ist ja die deklaration der Variable data..

    Ich würde mich freuen wenn mir da jemand weiterhelfen kann!
    Mit freundlihchen Grüßen,
    Leimstein



  • Sehe ich recht, daß base undefiniert ist statt 10?


  • Mod

    volkard schrieb:

    Sehe ich recht, daß base undefiniert ist statt 10?

    Ja. Und gcc sieht das auch. Umso komischer, da der Threadersteller doch schrieb:

    Kompilieren tu ich mit "gcc -Wall - Werror -pedantic -o temp temp.c

    Und das daher nicht compilieren dürfte.



  • Noch ne Kleinigkeit:

    long val;
        ...
        printf("%lu\n",val); // passt nicht, denn %u ist für unsigned
    


  • Achja, tatsächlich.
    Habe jetzt die Zeile "base=10;" eingefügt und es funktioniert.
    Vielen Dank!

    Aber warum kam der Fehler nur wenn ich die Variable data im Programm hatte?
    Ist das soeine Eigenheit der Programmiersprache die man sich nicht (oder nur mit sehr aufwändiger Nachforschung) erklären kann?

    Der Fehler kam übrigens auch wenn ich statt den Kommentaren diese beiden Zeilen einfügte:

    char *data;
    [...]
    data = NULL;
    

    Nochmal vielen Dank und schöne Grüße,
    Leimstein



  • Leimstein schrieb:

    Ist das soeine Eigenheit der Programmiersprache die man sich nicht (oder nur mit sehr aufwändiger Nachforschung) erklären kann?

    Ja, so bin ich vorgegangen. Alles sah ja richtig aus.
    Nun ist es aber so, daß wenn ein Punkt im Programm sich nicht an den Standard hält, der Compiler nicht mehr verpflichtet ist, ein korrektes Programm zu erzeugen. Er darf alles machen, inclusive dafür sorgen, daß Dämonen aus der Nase des Programmierers erscheinen. Siehe "nasal demons". Der gcc ist da ganz extrem. Der macht sich so viele Gedanken darum, wie er hübschen Ausgabecode erzeugen kann, und der ist wirklich verdammt hübsch, daß er wenn was nicht stimmt, auch mal total verwirrt ist.

    Meinsten (immer?) muß man aber nur alles untersuchen, was vor dem Fehler ist. Und da habe ich jede Zeile durchgelesen und es war kein Fehler zu sehen. Aber er mußte einfach da sein. Und plötzlich war er da. 🙂



  • Wenn du mit nicht initialisierten Variablen arbeitest, betrittst du den Bereich undefinierten Verhaltens. Und da reichen schon kleine Verschiebungen (z.B. eine zusätzliche Variable), um den Default-Inhalt der Variablen (und damit die weiteren Reaktionen) zu ändern.


Anmelden zum Antworten