Ошибка сегментации в strtok_r в строке стека - PullRequest
0 голосов
/ 06 ноября 2019

Я получаю ошибку сегментации в 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 Ответ

1 голос
/ 06 ноября 2019

Из документации :

Аргумент 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);
}
...