将地址分配给通过引用传递的void指针

问题描述

初次呼叫者,长时间的监听者。我有一个关于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;
}