【问题标题】:why am i getting segmentation fault core dumped? [closed]为什么我得到分段错误核心转储? [关闭]
【发布时间】:2017-11-02 14:11:38
【问题描述】:

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

【问题讨论】:

  • 欢迎来到 Stack Overflow! 寻求调试帮助的问题(为什么这段代码不起作用?)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example
  • 当您创建Minimal, Complete, and Verifiable Example 时,请确保它确实编译
  • 请正确格式化您的代码。
  • 另外,请使用调试器在代码中定位崩溃发生的位置,并在崩溃发生时检查所有相关变量的值。确保它们是有效的。如果您仍然无法弄清楚,请在您的问题中包含所有这些信息。
  • cmd[d]name 语法无效,您缺少.

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


【解决方案1】:

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

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

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

例如

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

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

【讨论】:

  • 你是怎么知道的? cmd[d]name 是一个语法错误,充其量是没有尝试修改实际执行的文字。 :)
  • @SouravGhosh 我认为这只是一个错字。
  • You may not...嗯,你必须不要,除非你可以在你的代码中导致 UB.. :)
  • 我刚刚修复它,错字在这里而不是在我的代码中。我仍然遇到分段错误。
  • @Esmo 根据弗拉德在这个答案中所说的话,你做了什么来尝试解决它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
相关资源
最近更新 更多