【问题标题】:Assign address to void pointer passed by reference将地址分配给通过引用传递的 void 指针
【发布时间】:2020-12-29 02:14:37
【问题描述】:

第一次来电,长期倾听。我有一个关于一些 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 中我 malloc 一些内存(多少取决于几个因素),将 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 指针的规则,所以我猜这里有一个适用的特定规则?

【问题讨论】:

  • pp_out_data 应该是指向void* 的指针。你怎么写“指向void*的指针”?

标签: c void-pointers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您正在传递一个 指向指针的指针,因此请这样定义函数:

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

    【讨论】:

    • 我知道你在那里做了什么,但是对于仅仅传递一个内存地址来说,两个间接可能并不理想。请参阅上面的我的 cmets。
    • 没错,在这种简单的情况下,简单地返回 void * 会更好。您总是可以将其作为另一个答案发布,但我相信我的答案仍然具有指导意义。
    • 是的!这就是我一直在寻找的。谢谢!
    • 另外,返回一个 void * 会起作用,但我想我过度简化了发布问题,因为我实际上返回了一个状态码。
    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 2019-09-16
    • 2013-06-05
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多