为什么我的分段故障核心被丢弃了?

时间:2017-06-01 12:17:54

标签: c string segmentation-fault undefined-behavior string-literals

当我在下一个代码部分使用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);
}

1 个答案:

答案 0 :(得分:3)

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

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

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

例如

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

另一种方法是使用标准C函数strcspnstrspn代替strtok来查找子字符串。