【问题标题】:Modifying original with void pointers in C在 C 中使用 void 指针修改原始文件
【发布时间】:2012-11-23 14:41:21
【问题描述】:

我试图通过引用将变量传递给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;
}

【问题讨论】:

  • 你不需要在 C 中向void * 转换任何东西,它是由编译器隐式添加的。
  • 你不能把update_struct 电话换成filter->data.a = temp_data.a 吗?

标签: c pointers pass-by-reference void void-pointers


【解决方案1】:
void update_value(void *oldValue, void *newValue)
{
    oldValue = newValue;
}

在这个 sn-p 中,您只更新指针变量,而不是它指向的值。 您必须取消引用指针才能访问实际数据。如果您想要一个真正通用的 setter 解决方案,您可以使用 memcpy,但您需要向 update_value 传递一个大小参数,以告诉 memcpy oldValue 和 newValue 指向的数据类型的大小是多少。

void update_value(void *oldValue, void *newValue, size_t dataSize)
{
    memcpy(oldValue, newValue, dataSize);
}

【讨论】:

    【解决方案2】:

    我没有阅读完整的代码,但是这个函数什么也没做:

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

    oldValuenewValue 都是保存内存地址的局部变量。由于局部变量被删除,函数退出时赋值效果丢失。

    更新

    您可能希望将oldStruct 的字段a 更新为newStrcut 的字段。然后你的函数update_struct 可以看起来像

    void update_struct(myStruct *oldStruct, myStruct newStruct)
    {
        oldStruct->a = newStruct.a;
    }
    

    由于oldStruct 是一个指向结构的指针,存在于某个地方,赋值会影响它。

    幸好我不知道a成员的类型。

    更新 2

    您也可以通过指针发送第二个结构来节省处理时间:

    void update_struct(myStruct *oldStruct, myStruct *newStruct)
    {
        oldStruct->a = newStruct->a;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2014-08-23
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      相关资源
      最近更新 更多