strtok_r () segfaults каждый раз, когда я его вызываю, даже в простых ситуациях - PullRequest
0 голосов
/ 10 февраля 2019

Я прочитал руководство для strtok_r, и я относительно уверен, что я правильно его использую, но каждый раз происходит сбой.

Поэтому я решил написать быстрый тестзапрограммировал и обнаружил, что это также segfaults:

//This define probably not necessary
//POSIX_C_SOURCE is defined as 200809L on my system
//It still doesn't work even with this define though..
#define _POSIX_SOURCE 

#include <stdio.h>
#include <string.h>

int main(void)
{
    char input[255];
    char* token;
    char** saveptr;

    memset(input, 0, sizeof(char) * 255);
    fgets(input, sizeof(input), stdin);
    token = strtok_r(input, ":", saveptr);
}

Трассировка от valgrind:

==15796== Command: ./a.out
==15796== 
==15796== Use of uninitialised value of size 8
==15796==    at 0x4EDABA4: strtok_r (strtok_r.c:73)
==15796==    by 0x10878B: main (in /home/pluh/a.out)
==15796== 
==15796== Invalid write of size 8
==15796==    at 0x4EDABA4: strtok_r (strtok_r.c:73)
==15796==    by 0x10878B: main (in /home/pluh/a.out)
==15796==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==15796== 
==15796== 
==15796== Process terminating with default action of signal 11 (SIGSEGV)

Я только поставил «test» в stdin, так что я знаю, что он не переполняется.Я что-то здесь не так делаю?Это самый простой сценарий использования, который я мог придумать, и он все еще ломается.

1 Ответ

0 голосов
/ 10 февраля 2019

Попробуйте так:

int main(void)
{
    char input[255];
    char* token;
    char* saveptr;

    fgets(input, sizeof(input), stdin);
    token = strtok_r(input, ":", &saveptr);

    printf("%s, %s\n",token,saveptr);
}
...