2013-10-26 51 views
0

我定義了一個結構。C中的這個聲明有什麼問題?

typedef struct bucket { 
    char *key; 
    void *value; 
    struct bucket *next; 
} Bucket; 

該函數在名爲「htable.h」的文件中定義。

int put(Table *table, const char *key, void *value) { 

    Bucket insertBucket; 
    strcpy(insertBucket.key, key); 

    return 0; 
} 

這不應該是有效的嗎?

+1

應該是的。是什麼讓你相信它不是? – 2013-10-26 06:20:38

+0

運行時錯誤在這裏'strcpy(insertBucket.key,key);' – this

+0

char * key,Bucket的成員,需要在strcpy之前被malloc化。 – ryyker

回答

3

問題是您沒有爲字符指針key分配任何內存,並且您正在嘗試將字符串複製到該字符指針。它給你未定義的行爲。
key只是一個未初始化字符指針,它只是指向一個隨機address.To能夠利用任何指針有兩個條件:

  1. 它應指向一個有效的存儲區&
  2. 內存應該爲您的使用保留(應該擁有)

您違反了兩者。

+1

-1,對不起,挑剔但字符指針不對大到足以容納一個角色。你可以做邪惡的角色並存儲多達四個,但這是不好的代碼。 – this

+0

@自己:足夠公平,經過修改。 –

+0

這是一個未初始化的指針,所以它沒有指向任何有用的地方。 –

1

您需要分配一些空間來存儲您的字符串。現在你只需要一個原始指針。事情是這樣的:

char dest[80]; // arbitrary amount of space for example 
strcpy(dest, key); 

理想情況下,你會想要做這裏面你struct

typedef struct bucket { 
    char key[80]; 
    // .. other members .. 
} Bucket; 
+1

如何將數據複製到本地變量中去幫助?或者你建議'char dest [80];'替換結構中的一個元素? –

+0

更新爲更具體。 – yamafontes

+1

更好...也許一個長度檢查的副本將是一個好主意(但要小心'strncpy()'不能終止超長字符串)。 –