【问题标题】:SIGSEGV in vprintf() after printing result of strtok打印 strtok 结果后 vprintf() 中的 SIGSEGV
【发布时间】:2013-07-28 01:54:25
【问题描述】:

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

我的代码如下所示:

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

运行这个sn -p的结果导致结果:

/usr/local/sbin
Segmentation fault

如果我在gdb 中运行程序,我会得到错误

程序收到信号 SIGSEGV,分段错误。

0x00007ffff7a98cba in vfprintf() from /lib/x86_64-linux-gnu/libc.so.6

关于导致此错误的任何提示?

【问题讨论】:

    标签: c printf strtok


    【解决方案1】:

    来自getenv 文档:

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

    换句话说,不要在getenv() 返回的结果上调用strtok() - 首先创建您自己的副本。

    【讨论】:

    • 如果我在 getenv 之后打印路径,我会得到 "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 所以不是那样的。
    • 刚看到。复制字符串似乎解决了我的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多