使用C中的void指针修改原始文件

dea*_*ake 0 c pointers pass-by-reference void void-pointers

我试图通过引用将变量传递给void指针,以更新原始值.当我尝试它时,旧值永远不会更新.任何帮助将不胜感激. gst_filter_chain就像主要功能(Gstreamer)

void update_value(void *oldValue, void *newValue)
{
    oldValue = newValue;
}

void update_struct(myStruct *oldStruct, myStruct newStruct)
{
    update_value((void *)&oldStruct->a, (void *)&newStruct.a)
}

static GstFlowReturn
gst_filter_chain (GstPad * pad, GstBuffer * buf)
{
    GstFilter *filter= GST_FILTER (gst_pad_get_parent (pad));
    myStruct temp_data;

    int buf_size = GST_BUFFER_SIZE(buf);     
    if(buf_size > 1) //if buffer is not empty
    {
        if(!filter->is_init)
        {
            memcpy(&filter->data, GST_BUFFER_DATA(buf), sizeof(myStruct));
            filter->is_init = TRUE;
        }
        else
        {
            memcpy(&temp_data, GST_BUFFER_DATA(buf), sizeof(myStruct));
            update_struct(&filter->data, temp_data);
        }
    }   


    gst_buffer_unref(buf);
    return GST_FLOW_OK;
}
Run Code Online (Sandbox Code Playgroud)

Spi*_*dey 5

void update_value(void *oldValue, void *newValue)
{
    oldValue = newValue;
}
Run Code Online (Sandbox Code Playgroud)

在此代码段中,您只更新指针变量,而不是它指向的值.您必须取消引用指针才能访问实际数据.如果你想要一个非常通用的setter解决方案,你可以使用memcpy,但是你需要传递给update_value一个size参数,告诉memcpy oldValue和newValue指向的数据类型的大小是多少.

void update_value(void *oldValue, void *newValue, size_t dataSize)
{
    memcpy(oldValue, newValue, dataSize);
}
Run Code Online (Sandbox Code Playgroud)