2010-04-07 59 views
1

我無法理解這樣的結果......問題使用空指針作爲函數參數

代碼:

void foo(void * key, size_t key_sz) { 
    HashItem *item = malloc(sizeof(HashItem)); 

    printf("[%d]\n", (int)key); 

    ... 

    item->key = malloc(key_sz); 
    memcpy(item->key, key, key_sz); 
} 

void bar(int num) { 
    foo(&num, sizeof(int)); 
} 

而且我這樣做呼叫:bar(900011009);

printf()輸出是:

[-1074593956] 

我真的需要key是vo id指針,我該如何解決這個問題?

回答

3

我認爲你需要這樣的:

printf("[%d]\n", *(int*)key); 

的關鍵是一個空指針爲int,所以你首先需要轉換爲int指針,則取消引用來獲得原始INT。

+0

是的,我試過'(int *)* key',但沒有工作,並且'*(int *)key'從來沒有出現在我身上。 – 2010-04-07 01:22:11

2

如果您將指針投射到int,您將獲得地址作爲值。您需要像其他任何一樣取消引用void指針。只有你不能直接取消void *,所以你必須先將它轉換成正確類型的指針,這裏是int *。然後取消引用該指針,即*((int *)key)(額外的括號以闡明優先級)。

+0

是的,我試過'(int *)* key',但沒有工作,並且'*(int *)key'從來沒有出現在我身上。 – 2010-04-07 01:22:39