我正在學習C語言,並且正在使用char *和char數組運行。我正在使用庫中的通用哈希集容器(我不想詳細描述)。該庫中包括功能char [1024] vs char *
void *HashSetLookup(hashset *h, const void *elemAddr);
,我不得不使用的哈希集合搜索,看是否該元素已經存在那裏(散列和比較功能是HashSet的結構的一部分)。在這種情況下,我使用散列集來存儲指向C字符串的指針,或者更具體地說(char * *)。我的問題是,下面的代碼給出了一個分段錯誤:
char word[1024];
/* Some code that writes to the word buffer */
HashSetLookup(stopList, &word);
而這個代碼工作正常(如預期):
char word[1024];
/* The same code as before that writes to the word buffer */
char* tmp = strdup(word);
HashSetLookup(stopList, &tmp);
free(tmp);
我以爲字符字[]與char *基本一致事情。唯一的區別是字符[1024]在堆棧中的固定長度爲1024,但堆中的tmp只佔用足夠的空間(strlen(word)+1)。
因此我不明白爲什麼我必須在堆中創建一個字符串副本才能調用此函數。爲什麼會發生? char * tmp = strdup(「something」)和char word [1024] =「something」之間有一些更基本的區別嗎?
顯示在第一個示例中寫入字的代碼。 – jergason 2010-07-04 19:39:28
在第一個示例中的函數調用之前,我沒有看到正在聲明/使用的變量「tmp」。 – MAK 2010-07-04 19:43:13
MAK,對不起,這是一個錯誤。我現在修好了。 – Siggi 2010-07-04 19:44:34