2

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

私はその機能を使ったことがないので、間違っているかもしれません。

よろしくお願いします。

4

1 に答える 1

5

s_ptrmallocまたは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は、悪夢を避けるための良い方法です..

于 2013-06-24T18:32:34.503 に答える