-5

当我在下一个代码部分使用strtok时,我得到了分段错误核心转储。该代码正在调试,但是当我运行它时,我得到了分段错误。我该如何解决它?为什么我得到分段错误核心转储?

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

欢迎来到Stack Overflow!寻求调试帮助的问题(为什么这个代码不工作?)必须包含所需的行为,特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者无益。请参阅:如何创建[mcve] ._ –

+0

当您创建[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)时,请确保它实际*编译*。 –

+0

请正确格式化您的代码。 –

回答

3

您不能修改字符串文字。任何修改字符串文字的尝试都会导致未定义的行为。

标准C函数strtok尝试在将字符串拆分为子字符串时插入终止零。

要解决该问题,请使用字符数组而不是指针name。或者动态分配内存并将一个字符串复制到指针name指向的分配内存中。

例如

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

另一种方法是使用标准的C函数strcspnstrspn代替strtok找到的子串。

+1

你是怎么知道这件事的? 'cmd [d] name'是一个语法错误,至多没有试图修改实际执行的文字。 :) –

+0

@SouravGhosh我认为这只是一个错字。 –

+0

'你可能不会'...好吧,你__必须不要,除非你确定在你的代码中导致UB .. :) –