繁体   English   中英

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

[英]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 指针的规则,所以我猜这里有一个特定的规则?

您正在传递一个指向 pointer 的指针,因此将函数定义为:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM