C問題

/*install: put (name, defn) in hashtab*/
struct nlist *install(char *name, char *defn) {
struct nlist *np;
unsigned hashval;
if((np = lookup(name)) == NULL){        /* not found */
        np = (struct nlistb*)malloc(sizeof(*np));
        if(np == NULL || (np -> name = strdup(name)) == NULL)
                return NULL;
        hashval = hash(name);
        np -> next = hashtab[hashval];
        hashtab[hashval] = np;
} else        /*alreadythere*/
        free((void *) np -> defn);        /* free previous defn */
        if((np -> defn = strdup(defn)) == NULL)
                return NULL;
        return np;
}

如果np內裡是NULL,那
np = (struct nlistb*)malloc(sizeof(*np));
sizeof(*np)應該看不到目標大小吧?
求解釋! Thanks!

sizeof 是Compile time時作用, 所以不關pointer內容的事。

sizeof(np) 等於 目前platform的pointer size
sizeof(*np) 等於 sizeof(nlist) , 等於struct的大小 。

寫成sizeof(nlist)比較易理解, 不過為防將來有人改過 np為其他struct的話就會抄memory, 所以用sizeof(*np)是比較保險。
大概這樣....希望沒錯

TOP

就係咁我先覺得怪。
Sizeof(np)會求得pointer np的大小。
Sizeof(*np)會求得那結構的大小,那為什麼不直接用結構名.
但是np內沒有指向,為什麼又求得*np所指向的結構大小?

TOP

回覆 3# carlhung

我不是已說了...
如果將來有人只改了這行
struct new_nlist *np;

那麼使用 sizeof(nlist) 寫法, 將會Allocate錯memory, 要作者找回這行改做新struct。
而使用 sizeof(*np)  會自動由compiler判斷,用了新struct size

TOP