堆栈字符串上strtok_r中的分段错误

时间:2019-11-05 21:02:55

标签: c segmentation-fault stack strtok

在下面的代码中,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有关?

非常感谢您提供任何答案。

1 个答案:

答案 0 :(得分:1)

来自documentation

  

saveptr参数是指向s char *内部使用的trtok_r()变量的指针,以维持解析同一字符串的连续调用之间的上下文。

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

将变量声明为char *,然后使用&将指针传递给变量。

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);
}