2013-06-24 3 views
2

Не должен ли я освобождать s_ptr после каждого вызова strtok_r() (извлечь токены из строк)?Должен ли я освобождать char при использовании 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); 
} 

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

С уважением.

ответ

5

s_ptr не должно быть освобождено, так как оно не распределено malloc или calloc или realloc. Man page говорит как

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 является хорошей практикой, чтобы избежать ночных кошмаров.

+1

Я думаю, что единственное, чего не хватает в этом ответе, состоит в том, чтобы сказать простым словам: strtok_r' делает * не * выделяет память – tay10r

+0

@TaylorFlores добавил, что в ответ :) – VoidPointer