2016-04-27 48 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()'。 –

相关问题