2009-09-21 94 views
4

我有以下結構:傳遞char數組爲結構構件

struct hashItem { 
    char userid[8]; 
    char name[30]; 
    struct hashItem *next; 
}; 

在功能下面我採取一個字符指針(char數組)的論點,即我想要分配到該結構。

void insertItem(struct hashItem *htable[], char *userid, char *name) 
{ 
    int hcode = hashCode(userid); 
    struct hashItem *current = htable[hcode]; 

    struct hashItem *newItem = (struct hashItem*) malloc(sizeof(struct hashItem)); 
    newItem->userid = userid; 
    newItem->name = name; 
    [...] 
} 

相反,我得到以下錯誤:

hashtable.c: In function ‘insertItem’: 
hashtable.c:62: error: incompatible types in assignment 
hashtable.c:63: error: incompatible types in assignment 

線62和63是`的newitem - > ...」行

回答

7

你幾乎肯定不希望只是如編譯器指出的,將char *賦給char [] - 類型不兼容,語義不是你想象的。我假設你希望struct成員包含兩個char *字符串的值 - 其中如果您想調用strncpy。

strncpy(target, source, max_chars); 
+0

假設我在代碼中的其他位置確定char數組長度小於給定的8/30字節長度,我將如何直接分配它並不複製它? – 2009-09-21 15:38:56

+0

在這種情況下,您會在結構中使用char *,並將指針複製到其中。 char *只是指向某些包含字符的內存的指針。 char []是n個字符的固定長度存儲分配。你不能以合理的方式在它們之間進行分配。 – 2009-09-21 15:43:03

+0

@Christian:確定長度與您是否分配或複製無關。你不能分配給C中的數組。該語言不允許。您必須決定是否希望新的hashItem包含傳遞給insertItem的字符串副本(在這種情況下,使用某種副本以及某種邊界檢查)或指向它的指針(在這種情況下,使用char *而不是結構中的char [])。 – 2009-09-21 15:55:45

0

您不能像指定的那樣將指向字符串的指針指定給字符數組。相反,你需要將字符串的內容與函數strncpy複製亞當表示:

strncpy (newItem->userid, userid, 8); 

當你聲明在它的字符數組的結構,你是裏面的結構分配內存本身來存儲給定的字符串長度。

當你傳遞一個指針到你的函數中時,你傳遞一個內存地址(一個整數),表示可以找到以null結尾的字符串。

將指針指定給數組沒有任何意義。數組已經爲它分配了內存 - 它不能被「指向」另一個位置。

雖然你可以在你的結構中使用指針,但是你需要非常小心,當你指定它們時,你告訴它們指向在你使用結構的時間內有效的東西。例如,這個代碼是不好的,因爲字符串傳遞給insertItem不復存在後fillStructure回報:

struct hashItem 
{ 
    char * userid; 
}; 

void insertItem (struct hashItem * item, char * userid) 
{ 
    item->userid = userid; 
} 

void fillStructure (struct hashItem * item) 
{ 
    const char string[] = "testing"; 
    insertItem (item, string); 
} 

int main(void) 
{ 
    struct hashItem item; 
    fillStructure (&item); 
    /* item->userid is now a dangling pointer! */ 
} 

更多,我會建議閱讀「數組和指針」的C常見問題的章節 - 開始Question 6.2並繼續閱讀。

+0

在此處插入關於strncpy的常見參數:如果傳入的用戶標識正好是8個字符,則此代碼將導致存儲的字符串不會被終止。這可能不是你想要的。 – 2009-09-21 15:58:05

0

您應昌你的

struct hashItem { 
    char userid[8]; 
    char *name; 
    struct hashItem *next; 
}; 

結構來分配一個字符指針的名字。在你定義的結構中 char name [30]只有30個字符。

+0

當然假設insertItem的調用者將確保名稱字符串在hashItem對象的生命週期內保持有效。 – 2009-09-21 15:57:16