glib.c 715 B

12345678910111213141516171819202122232425262728293031323334
  1. #include <common/glib.h>
  2. #include <common/string.h>
  3. /**
  4. * @brief 将数据从src搬运到dst,并能正确处理地址重叠的问题
  5. *
  6. * @param dst 目标地址指针
  7. * @param src 源地址指针
  8. * @param size 大小
  9. * @return void* 指向目标地址的指针
  10. */
  11. void *memmove(void *dst, const void *src, uint64_t size)
  12. {
  13. const char *_src = src;
  14. char *_dst = dst;
  15. if (!size)
  16. return dst;
  17. // 当源地址大于目标地址时,使用memcpy来完成
  18. if (dst <= src)
  19. return memcpy(dst, src, size);
  20. // 当源地址小于目标地址时,为防止重叠覆盖,因此从后往前拷贝
  21. _src += size;
  22. _dst += size;
  23. // 逐字节拷贝
  24. while (size--)
  25. *--_dst = *--_src;
  26. return dst;
  27. }