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

C 堆栈字符串上strtok_r的分段错误,c,segmentation-fault,stack,strtok,C,Segmentation Fault,Stack,Strtok,我在下面的一段代码中遇到了一个分段错误,我花了几个小时试图找出原因。其他页面上的答案是不能修改字符串文字,但(据我所知)我不能 #包括 #包括 #包括 int main(){ 字符请求[256]; //char*req=malloc(256*sizeof(char)); strcpy(req,“hello\r\n版本1.0\r\n\r\n”); 字符**lineSavePtr; char*line=strtok_r(请求,“\r\n”,lineSavePtr); } 如果我将req的声明切换为

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

#包括
#包括
#包括
int main(){
字符请求[256];
//char*req=malloc(256*sizeof(char));
strcpy(req,“hello\r\n版本1.0\r\n\r\n”);
字符**lineSavePtr;
char*line=strtok_r(请求,“\r\n”,lineSavePtr);
}
如果我将
req
的声明切换为动态声明,它就会工作。如果我使用
strtok
而不是
strtok\u r
,它也可以工作,所以我猜它可能与
lineSavePtr
有关

非常感谢您的回答。

来自:

saveptr
参数是指向一个
char*
变量的指针,该变量由s
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);
}

非常感谢,这很有效!如果我动态分配
req
,您可能知道它为什么会起作用吗?当您导致未定义的行为时,任何事情都可能发生,包括正常工作的外观。
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);
}