Ошибка сегментации при освобождении переменной после использования strt_ok - PullRequest
2 голосов
/ 26 июня 2019

У меня ошибка сегментации при выполнении этой простой программы (это просто облегченная версия, чтобы воспроизвести ошибку).

//   gcc main.c -Wall -Wextra -Wpedantic
//   ./a.out

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h> // uint32_t

int main(){

    char* rest = (char*)malloc(128 * sizeof(char));
    char* token= (char*)malloc(128 * sizeof(char)); 
    strcpy(rest,"Something_else");
    token = strtok_r(rest, "_", &rest);
    printf("%s\n", token);
    free(token);
    free(rest);
    return 0;
}

free переменной token не выдает никакой ошибки. free переменной rest всегда дает мне ошибку сегментации каждый раз, когда я использую функцию strok_r. Что здесь происходит? Любое предложение? Во время компиляции предупреждения не выдаются.

Вопрос

Как правильно переписать этот простой код ?

Ответы [ 2 ]

5 голосов
/ 26 июня 2019

Вам нужна память только для предложения, token и rest - просто указатели.

И, используя цикл while, вы можете увидеть все токены:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h> // uint32_t

int main(){

    char* rest , *token;
    char* setence= malloc(128 * sizeof(char)); 

    strcpy(setence, "Some_thing_else");

    token = strtok_r(setence, "_", &rest);

    while (token) 
    {
        printf("%s\n", token);
        token = strtok_r(NULL, "_", &rest);          
    }

    free(setence);

    return 0;
}

даст:

Some
thing
else
2 голосов
/ 26 июня 2019

Вы не должны ни выделять, ни освобождать переменную 'rest'. strtok_r использует третий аргумент для хранения того, куда он попал в исходной строке. Итак:

char* rest;
char* copy= (char*)malloc(128 * sizeof(char)); 
strcpy(copy,"Something_else");
char* token = strtok_r(copy, "_", &rest); 
// ...
free( copy);  // don't free token or rest
...