C-一个有关memcpy实现的问题
在OpenBSD中,memcpy的实现源码如下:
void *
memcpy(s1, s2, n)
void *s1;
const void *s2;
size_t n;
{
register const char *f = s2;
register char *t = s1;
if (f < t) {
f += n;
t += n;
while (n-- > 0)
*--t = *--f;
} else
while (n-- > 0)
*t++ = *f++;
return s1;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
linux下 (gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) 有默认传递给memcpy()函数的源和目标数组不能重叠的规定。
int main(int argc,char* argv[])
{
char buffer[80] = "helloworld!";
memcpy(&buffer[5],&buffer,strlen(buffer));
printf("%sn",buffer);
return 0;
}
输出:hellohellohelld!
GNU 对memcpy 做了很多优化,性能是最好。Glibc改变 memcpy导致bug出现。(http://www.solidot.org/story?sid=20983)
想想s1和s2有内存重叠的问题,你就知道为什么f<t时要从尾到头的拷贝。
int main(int argc,char* argv[])
{
char buffer[80] = "helloworld!";
memcpy(&buffer[5],&buffer,strlen(buffer));
printf("%sn",buffer);
return 0;
}
输出:hellohelloworld!