C语言实现mem_move函数报*操作数需为指针但为char类型错误求助
错误原因
- 报错的核心是对非指针类型的char值执行了指针解引用操作
- C语言中,指针的下标运算
ptr[i]本身等价于*(ptr + i),已经完成了解引用,拿到的是对应位置的值,类型为char - 你的代码里写的
*b[i]、*s[i]、*d[i]相当于对已经是char类型的值再次解引用,不符合语法要求,所以触发报错。
修正后的代码
void mem_move(void* dest, void* src, unsigned size) { char* d = dest, * s = src; // 注意:原代码固定100字节的缓冲存在越界风险,若size超过100会溢出,建议补充边界判断 char buff[100]; char* b = buff; for (int i = 0; i < size; i++) b[i] = s[i]; for (int i = 0; i < size; i++) d[i] = b[i]; } int main() { char buffer[] = "one two three "; mem_move(buffer + 3, buffer, 10); char buffer2[] = "one two three "; mem_move(buffer2, buffer2 + 3, 10); return 0; }
额外优化建议
- 固定长度的100字节缓冲区存在溢出风险,如果传入的size超过100会触发栈溢出,建议添加
if(size > 100) return;的边界判断,要么改用malloc动态申请对应size的内存,用完释放。 - 你当前先拷贝到临时缓冲再拷贝到目标地址的实现逻辑可以处理内存重叠的场景,符合memmove的功能要求。
内容的提问来源于stack exchange,提问作者Pen4o
相关产品推荐
相关产品推荐

