2014-11-01 63 views
0

C編程語言通過KNR - 第2版,第6.5節,他們已經定義了一個函數strdup這樣的:由此爲什麼他們在K&R部分6.5中使用函數strdup?

char *strdup(char *s) 
{ 
    char *p; 

    p = (char *) malloc(strlen(s) + 1) /* +1 for the '\0' */ 
    if (p != NULL) 
    strcpy(p, s); 
    return p; 
} 

的用法是一個字符串複製到結構tnode的構件限定:

struct tnode { 
char *word; 
int count; 
struct tnode *left; 
struct tnode *right; 
}; 

這樣調用:

struct tnode *addtree(struct tnode *p, char *w) 
{ 
... 
p->word = strdup(w); 
... 
} 

爲什麼我們不能使用這樣的東西?

strcpy(p->word, w); 
+0

您需要先完成malloc(),strdup函數才能將strcpy用於字符指針變量。單詞必須指向有效的記憶。當首次實例化它時,它可能指向任何地方。 – Scooter 2014-11-01 09:09:47

+0

你認爲那是將*複製到*的位置? 「將一個字符串複製到一個結構的成員上」 - 不,這不是它正在做的......該成員是一個指針,而不是一個數組。 – 2014-11-01 09:19:30

+0

@Scooter本質上,我想知道通過malloc()進行顯式分配的原因。我是(我)的印象是一個指針參數的聲明也爲相關數據類型分配內存。 – Sohail 2014-11-01 09:38:45

回答

3

如果用「像」

strcpy(p->word, w); 

程序將有不確定的行爲,因爲:1)P->詞是未初始化並具有任何未指定的值; 2)該語句試圖寫入未分配的內存。

如果將分配內存,並與存儲的有效地址初始化P->字,然後使用「像」

strcpy(p->word, w); 

那麼實際上你會寫同樣的strdup實現自己。

+0

因此,如果addtree接收結構本身而不是指向結構的指針,那麼「類似的東西」有效嗎? – Sohail 2014-11-01 09:35:32

+0

@captainsomewhere例如,如果結構將有足夠大的字符數組作爲參數傳遞一個字符串,那麼您可以簡單地將該參數複製到數組中。 – 2014-11-01 09:38:55

+2

@captainsomewhere:它是* char *'是否在結構中的獨立*。它與結構本身無關。 – usr2564301 2014-11-01 09:50:35

3

首先,你需要爲p->word分配內存,那麼你可以使用strcpy(p->word, w);wordchar指針,沒有內存之前分配給它。

所以,如果你不strcpy(p->word, w);分配內存,就會造成Undefined behavior.

+0

羅傑。不能投票,沒有足夠的聲譽。感謝您的鏈接。 – Sohail 2014-11-01 10:11:43

+0

@captainsomewhere:不用擔心船長:)我希望你瞭解情況;) – user1336087 2014-11-01 10:13:10

相關問題