每天一个开发小知识。面试中,我们可能遇到过让你实现
memcpy 函数。首先,你得知道 memcpy 函数是干什么的吧。memcpy 函数是内存拷贝函数,函数原型为:
void * memcpy(void * dest, void * src, unsigned int n);
实现的功能是从源(src)内存地址的起始位置开始,拷贝 n 个字节到目标(dest)内存地址。核心代码很简单,就是两个指针之间的赋值,然后同时向后移动。
*dest++ = *src++;
但是,我们需要注意两点:
两个指针可能不是同一数据类型,这样就不能保证它们自增(++)时,往后移动的字节数是一样的,所以,需要先将它们强制转换成 char *,再向后移动;
存在内存重叠的可能,如下图,src 指向的数据存放在内存地址为 [10001,10101] 的范围内,dest 指向的地址刚好落在这个范围内,如果还是按上面的语句赋值,会发生数据覆盖的情况。
void * memcpy(void * dest, const void * src, unsigned int count){ if (NULL== dest || NULL == src || 0 == count) { return NULL; } char * d; const char * s; if (dest > (src + count) || dest < src) { d = (char *)dest; s = (char *)src; while (count--) { *d++ = *s++; } } else { d = (char *)(dest + count - 1); s = (char *)(src + count - 1); while (count--) { *d-- = *s--; } } return dest;}
每天一个开发小知识,今天你学废了吗?