【问题标题】:Segmentation fault in strtok_r on stack string堆栈字符串上 strtok_r 中的分段错误
【发布时间】:2020-03-02 07:18:31
【问题描述】:

我在以下代码中的strtok_r 中遇到了分段错误,我花了几个小时试图找出原因。其他页面上的答案说您不能修改字符串文字,但是(据我所知)我不是。

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

int main() {
    char req[256];
    //char* req = malloc(256 * sizeof(char));
    strcpy(req, "hello\r\nversion 1.0\r\n\r\n");
    char** lineSavePtr;
    char* line = strtok_r(req, "\r\n", lineSavePtr);
}

如果我将req 的声明切换为动态声明,它会起作用。如果我使用strtok而不是strtok_r,它也可以工作,所以我猜它可能与lineSavePtr有关?

非常感谢您的任何回答。

【问题讨论】:

    标签: c segmentation-fault stack strtok


    【解决方案1】:

    来自documentation

    saveptr 参数是指向 char * 变量的指针,该变量由 strtok_r() 在内部使用,以维护解析相同字符串的连续调用之间的上下文。

    您提供了一个未初始化的指针,而不是指向 char * 变量的指针。当它试图取消引用指针时,会发生未定义的行为。

    将变量声明为char *,并使用&amp;传递指向该变量的指针。

    int main() {
        char req[256];
        //char* req = malloc(256 * sizeof(char));
        strcpy(req, "hello\r\nversion 1.0\r\n\r\n");
        char* lineSavePtr;
        char* line = strtok_r(req, "\r\n", &lineSavePtr);
    }
    

    【讨论】:

    • 非常感谢,成功了!如果我动态分配req,您可能知道为什么它会起作用吗?
    • 当您导致未定义的行为时,任何事情都可能发生,包括正常工作的外观。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 2017-09-07
    • 2011-10-30
    相关资源
    最近更新 更多