在打印strtok结果后的vprintf()中的SIGSEGV

时间:2013-07-28 02:08:38

标签: c printf strtok

我正在编写一些非常基本的代码,但我遇到了一个错误,我不确定它为什么会发生。

我的代码如下所示:

char* path = getenv("PATH");
if(path != NULL) {
    char* temp;
    temp = strtok(path, ":");
    printf("%s\n",path);
    printf("%s\n",temp);
}

运行此代码段的结果会导致结果:

/usr/local/sbin
Segmentation fault

如果我在gdb中运行该程序,则会收到错误

  

程序接收信号SIGSEGV,分段故障。

     来自/lib/x86_64-linux-gnu/libc.so.6的vfprintf()中的

0x00007ffff7a98cba

有关导致此错误的原因的任何提示?

1 个答案:

答案 0 :(得分:2)

来自getenv文档:

  

getenv()返回的指针指向内部存储器块。该函数返回的指针所指向的字符串不应被程序修改。某些系统和库实现可能允许使用特定函数(putenv,setenv ...)更改环境变量,但此类功能是不可移植的。

换句话说,请勿在{{1​​}}返回的结果上调用strtok() - 首先创建自己的副本。