为什么以下C程序会出现总线错误?

nc.*_*nc. 6 c strtok bus-error

我认为这是第一次失败的召唤.我写了C已经有一段时间了,我不知所措.非常感谢.

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
  char *str = "one|two|three";

  char *tok = strtok(str, "|");

  while (tok != NULL) {
    printf("%s\n", tok);
    tok = strtok(NULL, "|");
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Pup*_*ppy 7

字符串文字应该分配给const char*,因为修改它们是未定义的行为.我很确定strtok修改了它的参数,这可以解释你看到的坏事.

  • 你是对的:strtok修改了它的第一个参数.由于遗留原因,支持将字符串文字分配给非const char*,但不应在新代码中完成. (2认同)
  • 使用GCC,我相信`-Wwrite-strings`(未包含在`-Wall`中)会在您尝试执行此操作时向您发出编译器警告.当然,如果你的代码并非都是const-correct,那么你最终也可能会遇到一些虚假的警告,例如将字符串文字传递给你自己的函数时,它不会修改它的参数,而是声明为` f(char*)`而不是`f(const char*)`. (2认同)