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

Assign address to void pointer passed by reference

第一次来电,长期倾听。我有一个关于 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 指针的规则,所以我猜这里有一个适用的特定规则?

您正在将一个 指针传递给一个指针,因此定义函数如下:

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, &a_bunch_of_data, d_size);
    memcpy(pp_out_data, &p, sizeof(p));
    return p;
}