内存踩踏主要发生在 c语言库函数 memcpy 中,而 memmove有相应机制。
memcpy
void *memcpy(void *dest, const void *src, size_t n)
{
char *dp = dest;
const char *sp = src;
while (n--)
*dp++ = *sp++;
return dest;
}
memmove
void *memmove(void *dest, const void *src, size_t n)
{
unsigned char *pd = dest;
const unsigned char *ps = src;
if (__np_anyptrlt(ps, pd))
for (pd += n, ps += n; n--;)
*--pd = *--ps;
else
while(n--)
*pd++ = *ps++;
return dest;
}
C语言库函数 memcpy 和 memmove 的区别 - 云+社区 - 腾讯云 (tencent.com)
主要是在memmove之中增加了一个判断,如果待移植内存与目标内存有重叠,则从反方向开始复制