segmentation fault bei einfach verketteter liste - wieso?
-
hallo,
ich habe eine verlinkte liste um elemente die über den shared memory übergeben werden zu speichern, aber bekomme immer bei der zuweisung elList->first = NULL; einen segmentation fault. Eigentlich müsste das doch passen? versteh momentan nicht wo das Problem liegt, hoffe ihr könnt mir helfen - hier mal der code zur linked list und ein teil der main methode bis zum segmentation fault:
**
main methode:**[cpp]int main (int argc, char **argv) {
key_t key;
SHMSTRUCT *pSharedMem;
element * el;
struct list *elList;
struct list *tempList;
struct list *tempList2;int bool = 0;
long nNextTurn = 1; /*client has to fill shared memory first */key = 34547;
elList->first = NULL; HIER PASSIERT DER SEGMENTATION FAULT
...
...[/cpp]list header:
#include "seqev.h" #ifndef SHMTYPE_H_ #define SHMTYPE_H_ #define SHMSZ 64 #define EVC_KEY 94666590 #define SQC_KEY 94257591 #define PERM 0666 typedef struct shm_struct{ char command; int key; char data[SHMSZ]; } SHMSTRUCT; typedef struct elemnt{ int key; char data[SHMSZ]; struct elemnt *nextMsg; } element; struct list{ int count; element* first; }; #endif /* SHMTYPE_H_ */
DANKE!
-
elList ist ja nur ein Zeiger auf ein struct list. Du musst schon noch Speicher dafür reservieren, bevor du dessen Elemente schreiben/lesen kannst.
-
ja stimmt danke
-
Ich erkenne in Deiner main-Funktion keine Initialisierung des Zeigers 'elList'. Er zeigt undefiniert irgendwo in den Speicher und so schlägt die Dereferenzierung fehl.
Vor dessen Verwendung mußt Du ihn initialisieren (ihm einen gültigen Wert zuweisen), im einfachsten Fall mit der Funktion 'malloc':struct list *elList; elList= (struct list*) malloc (sizeof(struct list)); elList->first = NULL;
Danach tritt kein Speichersegmentfehler mehr auf (vorausgesetzt 'malloc' war in der Lage, Speicher anzufordern. Sonst zeigt 'elList' jetzt auf die Adresse 0 und erzeugt einen Speicherzugriffsfehler bei der Dereferenzierung). Und nicht vergessen, den Speicher irgendwann mit 'free' wieder freizugeben.
Eine andere Variante besteht darin, 'elList' zu einer Variablen vom Typ 'struct list' zu machen (kein Zeiger):
struct list elList; elList.first = NULL;
funktioniert auch und um die Speicherfreigabe brauchst Du Dir keinen Kopf zu machen.
mfg
edit: hab etwas lange überlegt und ausprbiert, da war @Tim halt schneller.