简体   繁体   English

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

[英]Segmentation fault in strtok_r on stack string

I'm getting a segmentation fault in strtok_r in the following piece of code and I've spent a few hours trying to figure out why.在下面的一段代码中,我在strtok_r中遇到了分段错误,我花了几个小时试图找出原因。 Answers on other pages say you can't modify a string literal, but (as far as I know) I'm not.其他页面上的答案说您不能修改字符串文字,但是(据我所知)我不是。

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

If I switch the declaration of req to the dynamic one, it works.如果我将req的声明切换为动态声明,它就可以工作。 It also works if I use strtok instead of strtok_r , so I'm guessing it might have something to do with lineSavePtr ?如果我使用strtok而不是strtok_r它也有效,所以我猜它可能与lineSavePtr

Thanks a lot for any answers.非常感谢任何答案。

From the documentation :文档中:

The saveptr argument is a pointer to a char * variable that is used internally by s trtok_r() in order to maintain context between successive calls that parse the same string. saveptr参数是一个指向char *变量的指针,该变量由 s trtok_r()内部使用,以维护解析相同字符串的连续调用之间的上下文。

You've provided an uninitialized pointer, not a pointer to a char * variable.您提供了一个未初始化的指针,而不是指向char *变量的指针。 When it tries to dereference the pointer, undefined behavior occurs.当它试图取消引用指针时,会发生未定义的行为。

Declare the variable as char * , and pass a pointer to the variable using & .将变量声明为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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM