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!