使用strtok_r时,我不应该释放char

时间:2013-06-24 18:29:31

标签: c strtok

每次调用strtok_r()后都不应该释放s_ptr(从字符串中提取标记)?

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);
}

我从未使用过这个功能,所以也许我错了。

最好的问候。

1 个答案:

答案 0 :(得分:5)

s_ptr不应被释放,因为它不是由malloccallocrealloc分配的。 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的指针是避免恶梦的好方法。