【发布时间】:2014-05-05 15:25:23
【问题描述】:
我正在尝试从作为参数传递给函数的 void* array 检索值。
这是作为void * data 参数传递给我的函数的内容:
void *sredp[3];
sredp[0] = (void*)buf;
sredp[1] = (void*)(&len);
sredp[2] = (void*)(&ri);
来源:https://github.com/kamailio/kamailio/blob/master/udp_server.c#L481
为了解除对前两个字段的引用,我使用以下代码:
int my_fnc(void *data)
{
str *obuf;
obuf = (str*)data;
}
str 是 Kamailio 服务器的内部类型 (http://www.asipto.com/pub/kamailio-devel-guide/#c05str)。
我想知道如何从void *data 取消引用ri 字段。我正在尝试这样做:
int my_fnc(void *data)
{
struct receive_info * ri;
ri = (struct receive_info*)(data + 2*sizeof(void*));
}
当我尝试打印 receive_info 结构 (https://github.com/sipwise/kamailio/blob/4ee1c6a799713b999aac23de74b26badbe06d0aa/ip_addr.h#L132) 时,它似乎给了我一些数据,但我不知道这些只是内存中的一些随机字节还是我应该检索的正确数据。
所以我的问题是我是否做得对,是否有另一种/更好的方法来实现我的目标?
【问题讨论】:
-
void *和其他数据指针类型的转换无用且令人困惑,应该删除。 -
答案取决于您传递给
my_fnc的内容。建议把签名改成void my_fnc(void** data_ptr)。 -
无法在
void *类型上进行指针运算。您可以通过转换为char *来指针算术。 -
@harper 我期待将参数传递给我正在监听的事件,就像您在这一行中看到的那样:github.com/kamailio/kamailio/blob/master/udp_server.c#L485 所以它是
(void*)。 -
@unwind 在这种情况下,这不是选择的问题。我从 Kamailio 服务器的核心获取这个空数组,我无法更改。
标签: c pointers void-pointers