-5

ich erhalte Segmentation Fault core dumped, wenn im strtok am nächsten Codeteil verwendet wird. Der Code wird debuggt, aber wenn ich ihn ausführe, bekomme ich den Segmentierungsfehler. Wie kann ich es reparieren?Warum bekomme ich Segmentierung Fehler Core Dump?

struct{ char *name; 
void(*func)(void); 
}cmd[]={ 
{"read_cm",read_cm}, 
{"NA",NULL} 
}; 
int d; 
char *s="_\n"; 
    char *token2; 
    for(d=0;cmd[d].func!=NULL;d++) 
    { 
    token2=strtok((cmd[d].name),s); 
} 
+0

Willkommen Überlauf zu Stack! _Questions Debugging Hilfe sucht (warum nicht dieser Code zu arbeiten?) Muss das gewünschte Verhalten, um ein bestimmtes Problem oder Fehler enthalten und den kürzesten Code notwendig, es in der Frage selbst zu reproduzieren. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: Erstellen eines [mcve] ._ –

+0

Wenn Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen, stellen Sie bitte sicher, dass es tatsächlich * kompiliert *. –

+0

Bitte formatieren Sie Ihren Code korrekt. –

Antwort

3

Sie dürfen kein Zeichenfolgenliteral ändern. Jeder Versuch, ein Zeichenfolgenliteral zu ändern, führt zu undefiniertem Verhalten.

Die Standard-C-Funktion strtok ein Abschluß Null einzufügen versucht, während eine Zeichenkette in Teilzeichen splitten.

das Problem zu beheben, anstatt des Zeigers name ein Zeichen-Array verwenden. Oder weisen Sie Speicher dynamisch zu und kopieren Sie eine Zeichenfolge in den zugewiesenen Speicher, auf den der Zeiger name zeigt.

Zum Beispiel

struct 
{ 
    char name[8]; 
    void(*func)(void); 
} cmd[] = 
{ 
    { "read_cm", read_cm }, 
    { "NA", NULL } 
}; 

Ein weiterer Ansatz ist Standard-C-Funktionen strcspn und strspn statt strtok zu verwenden Strings zu finden.

+1

Wie haben Sie das erfahren? 'cmd [d] name' ist ein Syntaxfehler, im besten Fall gibt es keinen Versuch, das tatsächlich ausgeführte Literal zu ändern. :) –

+0

@SouravGhosh Ich denke, es ist nur ein Tippfehler. –

+0

'Sie dürfen nicht' ... nun, Sie __müssen__ nicht, es sei denn, Sie sind in Ordnung UB in Ihrem Code .. :) –

Verwandte Themen