Разве я не должен освобождать char при использовании strtok_r

Разве я не должен освобождать s_ptr после каждого вызова strtok_r() (извлекать токены из строк)?

static void get_uevent_info(struct media_device_entry *md_ptr, char *dname)
{
    FILE *fd;
    char file[PATH_MAX], *name, *p;
    char s[1024];
    char *s_ptr;

    snprintf(file, PATH_MAX, "%s/%s/uevent", dname, md_ptr->node);
    fd = fopen(file, "r");
    if (!fd)
            return;
    while (fgets(s, sizeof(s), fd)) {
            p = strtok_r(s, "=", &s_ptr);
            if (!p)
                    continue;
            name = p;
            p = strtok_r(NULL, "\n", &s_ptr);
            if (!p)
                    continue;
            if (!strcmp(name, "MAJOR"))
                    md_ptr->major = atol(p);
            else if (!strcmp(name, "MINOR"))
                    md_ptr->minor = atol(p);
    }

    fclose(fd);
}

Я никогда не использовал эту функцию, так что, возможно, я ошибаюсь.

С наилучшими пожеланиями.


person user1840007    schedule 24.06.2013    source источник


Ответы (1)


s_ptr не должен освобождаться, так как он не выделен malloc, calloc или realloc. Справочная страница гласит:

The saveptr argument is a pointer to a char * variable that is used internally by strtok_r() in order to maintain context between successive calls that parse the same string.

Тем не менее, strtok_r не выделяет память. Таким образом, достаточно просто отправить адрес указателя на char, т. е. char **, и после возврата ничего не нужно. Это не имеет значения, даже если char * не инициализирован, но все же инициализация указателей на NULL - хорошая практика, чтобы избежать кошмаров.

person VoidPointer    schedule 24.06.2013
comment
Я думаю, что единственное, чего не хватает в этом ответе, это сказать простыми словами, что strtok_r не выделяет память - person tay10r; 24.06.2013
comment
@TaylorFlores добавил это в ответ :) - person VoidPointer; 24.06.2013