2016-04-27 2 views
0

構造体にvoid *値があり、ソケット経由でサーバーに送信する必要があります。私はvoid *からhtonlを使用するように変換

int value = htonl(kv->value); 

を使用する必要があります知っているが、コンパイラは、私も動作しませんでした、intにボイド*をキャストしようとしたエラー

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

を投げていると私は

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値を指している場合、上記のキャストおよび逆参照は、の未定義の動作につながります。

+0

これは、 'void *'がメモリのどこかに格納された 'long'変数を指していることを前提としています。 –

+0

@RemyLebeauちょっとメモを付け加えました。 –

+1

'void *'が 'short'変数を指している場合、' void * 'を' uint32 * 'ではなく 'short *'にキャストする必要があります。正しいデータ型にキャストする必要があります。しかし、 'short'値を' htonl() 'に渡すことはまったく問題なく、単純に32ビットに拡張されます。それ以外の場合は、代わりに 'htons()'を使用してください。 –

関連する問題