【问题标题】:"invalid use of void expression": copy data from addr 1 to addr 2 [duplicate]“无效使用无效表达式”:将数据从 addr 1 复制到 addr 2 [重复]
【发布时间】:2021-11-04 23:18:41
【问题描述】:

我尝试在 C 中编写类似“memcpy”的函数来将数据块从源地址复制到目标地址。

*dst_addr++ = *src_addr++;行出现错误:"invalid use of void expression"

我写的函数:

void MemCpy(void *src_addr, void *dst_addr, int length)                
{
    while(length--)
    {
        // copy by single byte
        *dst_addr++ = *src_addr++;
    }

    return dst_addr;
}

如果以后需要,我使用void 指向任何对象类型。

为什么我用错了“void”?有人可以解释我的错误吗?

【问题讨论】:

  • 类型 void 没有大小。如果要访问内存,则必须转换为其他指针类型,例如 char*。 GCC 包含一个扩展,它允许使用 void* 进行指针运算,但取消引用也不适用于 GCC。
  • 注意:为什么 return dst_addr 用于 void 函数?

标签: c void memcpy void-pointers


【解决方案1】:

你的代码有两个问题:

  • void 没有大小,您不能取消引用 void 指针,也不能对它们执行指针运算
  • 你忘记了* 中的void *MemCpy(...

正确代码:

void *MemCpy(void *src_addr, const void *dst_addr, size_t length)
{
  const char *s = src_addr;
  char *d = dst_addr;

  while (length--)
    *d++ = *s++;

  return dst_addr;
}

顺便说一句,在原来的memcpy中,第一个参数是目标指针,所以你的MemCpy函数和原来的memcpy不太一样。

【讨论】:

    【解决方案2】:

    您不能对void* 执行指针运算。您必须转换为适当的类型。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多