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
相关产品推荐
相关产品推荐

