【问题标题】:What should be the correct way to assign a value to a non-empty void* pointer in C?在C中为非空void *指针赋值的正确方法应该是什么?
【发布时间】:2010-12-03 08:28:52
【问题描述】:

我有以下代码:

void funcA(void*   pArg)
{
    STRUCTA abc;
    .
    . // Some processing here
    .

    if (pArg)
       (STRUCTA *)pArg = abc;
}

问题是,这段代码抛出了以下警告: 警告:赋值目标不是真正的左值;这将是未来的一个硬错误

如果没有强制转换,我会收到另一个警告,说我正在尝试取消引用 void 指针...

由于警告被视为错误,我不能使用此代码 - 但我真的不能使用除 void* 之外的任何其他指针类型作为参数。有没有我想念的优雅解决方案?

有什么办法可以做到吗?

【问题讨论】:

    标签: c pointers casting compiler-warnings void-pointers


    【解决方案1】:

    (STRUCTA *)pArg 是指针类型,而 abc 不是。您需要取消引用指针:

    *(STRUCTA *)pArg = abc;
    

    【讨论】:

    • 感谢您的简洁回复...但 Benoit 已在 2 分钟前以完全相同的解释回答,因此必须将他标记为正确答案!
    【解决方案2】:

    您正在将 STRUCTA 分配给指向 STRUCTA 的指针。

    宁可这样做:

    *((STRUCTA *)pArg) = abc;
    

    【讨论】:

      【解决方案3】:

      试试这个:

      memcpy(pArg, &abc, sizeof(abc));
      

      但是,您必须确保 pArg 指向已分配内存的 sizeof(abc) 字节。

      【讨论】:

      • 接受的答案更加优雅,并指出了我一直在犯的错误......
      • 不过,memcpy 可能是这里的方法。任何 *(..) = .. 在我眼里都不优雅。
      【解决方案4】:

      也许pArg = (void *) abc;

      编辑:

      pArg = (void *) (&abc);?

      【讨论】:

      • @Marcelo - 你是绝对正确的。我错过了 abc 不是指针开头的事实。
      猜你喜欢
      • 2023-04-02
      • 2019-07-10
      • 2017-03-01
      • 2021-01-07
      • 2022-01-21
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多