Zugreifen von Array-elementen ohne das "[]"



  • Hallo!

    Habe mich mit arrays auseinandergesetzt, und bei C kann man ja auf Elemente auf zwei verschiedene Arten zugreifen:

    int total = 10;
    int arr[total] = {9,6,3,6,2,3,4,8,1,4};
    
    //Gib mir element i:
    
    for(i=0;i < total;i++){
    
        int el = arr[i];  //oder zweite option:
        int el2 = *(arr + i);
    }
    

    Aber was mir aufgefallen ist, ist dass die zweite option manchmal >segmentation faults< entstehen, wenn das i = 0 ist. Weis vllt einer wieso? Ok in diesem Beispiel nicht, bei mir habe ich n array von Strukturen und greife dann auf ein Element der Struktur zu...aber das Prinzip ist das gleiche



  • Du kannst davon ausgehen, dass du die Fehler machst und nicht die Programmiersprache C oder der Compiler.
    Du bedienst C falsch; wenn es ein Trost ist: viele andere machen das auch.



  • Was ich damit auch meine, ist z.B. wenn ich dann ein 2-dim array habe, für diese dynamischen Speicher zur Verfügung stelle, kann ich es mit der zweiten Schreibweise auch nicht wieder "free"-n, also :

    //Irgendeine Struktur, egal!
    
    int total = 2; int i;
    Struktur **fst = malloc(sizeof(Struktur*)*total);
    fst[0] = malloc(sizeof(Struktur)*10);
    fst[1] = malloc(sizeof(Struktur)*10);
    
    //Jetzt den Speicher wieder freigeben:
    for(i =0; i < total;i++) {
    
    free(fst[i]); //das funktionert, aber andere schriebweise:
    free(fst +i); //bei i=0 funktioniert es, bei i =1 kommt ein Fehler
    }
    


  • Das liegt daran, dass Du free 2x aufrufst.



  • tinchi schrieb:

    ...
        int el = arr[i];  //oder zweite option:
        int el2 = *(arr + i);
    }
    

    tinchi schrieb:

    ...
    free(fst[i]); //das funktionert, aber andere schriebweise:
    free(fst +i); //bei i=0 funktioniert es, bei i =1 kommt ein Fehler
    }
    

    Ist Dir beim tippen nicht aufgefallen, dass Du in einem Beispiel dereferenzierst ( int el2 = *(); ) und im anderen nicht? ( free(); ) (Der '*')

    Jetzt überleg mal scharf, welchen Pointer Du free() jeweils übergibst.
    Und ich meine wirklich überlegen! Und sich den Unterschied bewusst machen!


Anmelden zum Antworten