You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言自定义MemCpy函数报invalid use of void expression错误的原因是什么?

错误原因及修复方案

核心错误点

  • 直接对void*类型指针执行解引用、自增操作

C语言中void属于不完整类型,没有定义对应的内存占用大小。编译器在处理*dst_addr时无法判断需要读取/写入多少字节的数据,处理dst_addr++时也无法确定指针偏移的步长,这是触发invalid use of void expression报错的直接原因。
你的代码逻辑是按单字节拷贝,只需要在操作前将void*强制转换为unsigned char*即可,char类型的大小固定为1字节,刚好匹配单字节拷贝的步长要求。

  • 函数返回值声明与实际逻辑冲突

你声明的MemCpy函数返回值类型为void,但函数末尾执行了return dst_addr;返回指针的操作,属于语法错误。可以将返回值类型修改为void*,和标准库memcpy的行为对齐。

修正后代码

void* MemCpy(void *src_addr, void *dst_addr, int length)                
{
    // 提前将void*转换为单字节操作的unsigned char*
    unsigned char *src = (unsigned char *)src_addr;
    unsigned char *dst = (unsigned char *)dst_addr;

    while(length--)
    {
        // 操作char类型指针的解引用、自增都是合法的
        *dst++ = *src++;
    }

    return dst_addr;
}

补充说明

当前实现和标准memcpy行为一致,不处理源地址和目标地址内存重叠的场景,如果需要兼容重叠场景,需要额外判断两个地址的前后关系,选择从高地址或者低地址开始拷贝,对应标准库memmove的实现逻辑。

内容的提问来源于stack exchange,提问作者Adil.Kolenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:42:03