我正在尝试从传递给函数的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)。
我想知道如何从ri
取消引用void *data
字段。我试图这样做:
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)时,它似乎给了我一些数据,但我不知道这些是来自内存的一些随机字节还是正确的数据我应该检索。
所以我的问题是,如果我做得对,如果有另一种/更好的方法来达到我的目标?
答案 0 :(得分:1)
你不能在C中使用void *进行指针运算。这需要它使用sizeof(void),它并不存在。
问题在于你的功能签名:
int my_fnc(void * data)
你的指针不是空的*,它是一个无效的**。 所以在使用之前将其投射:
void** d = (void**) data;
ri = (struct receive_info*)(d + 2);
这将使用sizeof(void *),这是一个标准指针大小。
答案 1 :(得分:1)
data
中的 my_fnc
必须被视为void**
才能提取真实数据。
int my_fnc(void *data)
{
void** sredp = (void**)data;
str* obuf = (str*)srdep[0];
// The pointer that contains len can be obtained from srdep[1]
// The pointer that contains ri can be obtained from srdep[2]
}
这是一个简单的程序,说明了:
#include <stdio.h>
void foo(void* data)
{
void** realData = (void**)data;
void* p1 = realData[0];
void* p2 = realData[1];
void* p3 = realData[2];
printf("sredp[0]: %p\n", p1);
printf("sredp[1]: %p\n", p2);
printf("sredp[2]: %p\n", p3);
int a1 = *(int*)p1;
float a2 = *(float*)p2;
double a3 = *(double*)p3;
printf("a1: %d\n", a1);
printf("a2: %f\n", a2);
printf("a3: %lf\n", a3);
}
int main()
{
int a1 = 10;
float a2 = 20.0f;
double a3 = 40.0;
void *sredp[3];
sredp[0] = &a1;
sredp[1] = &a2;
sredp[2] = &a3;
printf("sredp[0]: %p\n", sredp[0]);
printf("sredp[1]: %p\n", sredp[1]);
printf("sredp[2]: %p\n", sredp[2]);
foo(sredp);
}
运行程序的示例输出:
sredp[0]: 0x28ac2c sredp[1]: 0x28ac28 sredp[2]: 0x28ac20 sredp[0]: 0x28ac2c sredp[1]: 0x28ac28 sredp[2]: 0x28ac20 a1: 10 a2: 20.000000 a3: 40.000000