为何自定义实现的ft_memcpy函数无法正常工作?
问题分析:你的ft_memcpy无法正常工作的原因
咱们直接戳核心问题:你返回的不是初始的目标指针,而是循环结束后已经偏移到末尾的dst指针。
标准的memcpy函数明确要求返回传入的原始dst起始地址,但你的代码里,while循环中每次都对dst做了自增操作(*(char *)dst++),循环跑完后,dst已经指向了原始目标地址往后n个字节的位置,这完全不符合函数的预期行为。
举个实际例子:假设你传入的dst是0x1000,n是5,循环结束后dst会变成0x1005,你返回这个值的话,调用者拿到的就不是原来的目标缓冲区起始地址,后续对返回值的操作自然会出问题。
修正后的代码
你只需要先保存原始的dst指针,最后返回这个保存的值就行:
void *ft_memcpy(void *dst, const void *src, size_t n) { void *original_dst = dst; // 先把初始目标地址存起来 while (n--) { *(char *)dst++ = *(char *)src++; } return original_dst; // 返回最初的目标地址 }
额外提两个小细节:
- 给循环加上大括号能提升代码可读性,后续维护起来更方便
- 当n为0时,循环不会执行,直接返回原始指针,这也完全符合标准
memcpy的行为
内容的提问来源于stack exchange,提问作者KR34T1V
相关产品推荐
相关产品推荐

