2016-04-27 22 views
0

我在結構中有一個void *值,我需要通過套接字將它發送到服務器。我知道我需要使用從void *轉換爲使用htonl

int value = htonl(kv->value); 

但是編譯器引發錯誤

passing argument 1 of ‘htonl’ makes integer from pointer without a cast [-Werror] 

我也試過鑄造無效*爲int,沒有工作,我用

htonl(*kv->value); 

但是這也會造成錯誤。我如何將void *轉換爲正確的數據類型?

注意:結構不可編輯,因爲我正在編寫框架。

struct kvpair { 
    void *value; 
}; 
+3

'void *'在代碼中實際表示什麼?你指的是什麼,需要通過網絡發送? 'htonl()'和'ntohl()'只適用於整數,而不是指針。 * IF *'void *'本身包含實際的整數值,而不是指向內存其他地方的整數,那麼你可以按原樣鍵入'void *',例如:'uint32_t value = htonl((uint32_t )(kv-> value));'* IF * void *指向內存中其他位置的整數,您需要對指針進行類型轉換,然後將其解引用以獲取指向的值,例如:'uint32_t value = htonl(*(uint32_t *)(kv-> value));' –

+2

一個進程中的指針值對另一個進程沒有意義。你究竟想傳達什麼樣的數據? – dbush

回答

2

不能直接取消引用一個void *類型,你必須首先將它轉換爲東西,你可以解引用和間接引用這一點。

例如

uint32_t value = htonl(*(uint32_t *) kv->value); 

這種鑄造和提領要求kv->value實際指向的東西是你嘗試投它的類型。如果在您的代碼中kv->value指向單個short值,那麼上面的cast和dereferencing會導致未定義的行爲

+0

這個假設'void *'指向存儲在別處的'long'變量。 –

+0

@RemyLebeau剛剛添加了一個關於這個的說明。 –

+1

如果'void *'指向'short'變量,那麼您需要將'void *'強制轉換爲'short *'而不是'uint32 *'。您必須轉換爲正確的數據類型。但是將一個'short'值傳遞給'htonl()'是完全正確的,它將被簡單地擴展到32位。否則,請改用'htons()'。 –

相關問題