问题描述
初次呼叫者,长时间的监听者。我有一个关于void *指针的问题,似乎无法找到解释,所以也许有人可以对此有所了解。
我有一个处理函数,其中(除其他事项外)我声明一个空指针并将其通过引用传递给其他函数:
void some_handler(some args)
{
void * p_out_data;
some_other_function(&p_out_data);
// ... do some stuff with p_out_data after some_other_function stores an address
}
在some_other_function中,我分配了一些内存(多少取决于一些因素),将a_bunch_of_data复制到其中,并将其地址存储在p_out_data中,以便some_handler可以访问a_bunch_of_data:
void some_other_function(void * pp_out_data) // pp_out_data is the address of p_out_data
{
void * p = malloc(d_size);
memcpy(p,&a_bunch_of_data,d_size);
memcpy(pp_out_data,&p,sizeof(p));
}
一切正常。我的问题是:为什么将malloc()返回的内存地址存储到p_out_data的唯一方法是使用memcpy?我试图将地址直接存储在已取消引用的指针中:
*pp_out_data = malloc(d_size);
但是我收到有关非法使用void指针的错误。我知道关于空指针有很多规则,所以我猜想这里有一个适用的特定规则?
解决方法
您要将指针传递给指针,因此应这样定义函数:
void some_other_function(void **pp_out_data)
{
void * p = malloc(d_size);
memcpy(p,&a_bunch_of_data,d_size);
*pp_out_data = p;
}
,
*pp_out_data
不是您的指针变量;它是您的指针变量指向的数据。
换句话说,您已经取消引用了它。
如果您希望新地址通过您的pp_out_data
参数从函数中传递出去,那将无法正常工作; pp_out_data
中的地址正在按值传递。
return
代替函数中的新地址:
void* some_other_function(void* pp_out_data)
{
void* p = malloc(d_size);
memcpy(p,d_size);
memcpy(pp_out_data,&p,sizeof(p));
return p;
}