C-一个有关memcpy实现的问题

发布于 2017-02-02 07:14:15 字数 543 浏览 1165 评论 3

在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

虐人心 2017-10-06 02:39:37

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)

夜无邪 2017-07-14 07:01:28

想想s1和s2有内存重叠的问题,你就知道为什么f<t时要从尾到头的拷贝。

偏爱自由 2017-04-04 23:08:07

int main(int argc,char* argv[])
{
char buffer[80] = "helloworld!";
memcpy(&buffer[5],&buffer,strlen(buffer));
printf("%sn",buffer);
return 0;
}

输出:hellohelloworld!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文