Segmention fault bei Pointern



  • Hey,

    lerne gerade C (-c99 Standard). Jedoch verstehe ich nicht warum ich bei folgendem Code (letzte Zeile) ein "Segmention Fault" bekomme!

    int main() {
    	int array[10];
    	array[0] = 42;
    	int **dx;
    	int *array_next = array;
    	dx = &array_next;
    	int **dx_temp;
    	*dx_temp = *dx;
    }
    

    Hintergrund:

    **dx ist im Code ein Array.Ich muss den Array durch hochzählen der Adresse iterieren. Jetzt muss ich das in zwei Abschnitten machen also möchte ich den dx pointer quasi als kopie nochmal haben. Aber in erster Ebene mit einer anderen Adresse. Wenn ich ja einfach "dx = dx_temp" sage und dann *dx_temp++;, dann änder ich ja damit in *dx die Adresse auch.

    Daher die letzte Zeile. Jedoch bekomme ich da ein "Segmention Fault". Warum?



  • dx und dx_temp sind beides uninitialisierte Zeiger, d.h. sie zeigen irgendwohin. Beide versuchst du zu dereferenzieren, 1x zum Lesen, 1x zum Schreiben. Das ist UB, sei froh, dass du einen Laufzeitfehler bekommst, der dich auf diesen Unsinn hinweist.



  • Wutz schrieb:

    dx und dx_temp sind beides uninitialisierte Zeiger, d.h. sie zeigen irgendwohin. Beide versuchst du zu dereferenzieren, 1x zum Lesen, 1x zum Schreiben. Das ist UB, sei froh, dass du einen Laufzeitfehler bekommst, der dich auf diesen Unsinn hinweist.

    Okay das heißt ich müsste einfach:

    int **dx = NULL;
    int **dx_temp = NULL;
    

    schreiben und dann ist alles okay?



  • Nein. Du muesstest sie auf irgendwas zeigen lassen.



  • Wutz schrieb:

    dx und dx_temp sind beides uninitialisierte Zeiger

    Soso. Na, dann schauen wir uns das Programm noch einmal in ordentlich an und schmeißen noch ein paar Adressausgaben mit rein:

    #include <stdio.h>
    
    int main(void)
    {
        int **dx,**dx_temp;
        int array[10];
        int *array_next;
    
        array[0]=42;
        array_next=array;
        dx = &array_next;
        /**dx_temp = *dx;*/
    
        printf("array: %p\n"                  ,array);
        printf("array_next: %p\n"             ,array_next);
        printf("dx: %p, (*dx): %p\n"          ,dx        ,(*dx));
        printf("dx_temp: %p, (*dx_temp): %p\n",dx_temp   ,(*dx_temp));
    
        printf("%d|%d|%d\n",array[0],array_next[0],(*dx)[0]);
    
        return 0;
    }
    

    Ausgabe bei mir:

    array: 0x7fff02fea010
    array_next: 0x7fff02fea010
    dx: 0x7fff02fea008, (*dx): 0x7fff02fea010
    dx_temp: 0x7fff02fea130, (*dx_temp): 0x1
    42|42|42
    

    Und jetzt erklärt mir bitte, wo dx uninitialisiert sind.
    Also für mich sieht das so aus, als ob es ohne Probleme auf das Array im Stack zeigt. Nur dx_temp wird hier dereferenziert, bevor eine ordentliche Adresszuweisung passiert.



  • Zuletzt bearbeitet von JimboV am 18:07:45 08.12.2014, insgesamt 1-mal bearbeitet

    wurde wohl verändert


Anmelden zum Antworten