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

WordPress 开发 WordPress 开发 主题:1098 回复:2322

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

归属感 发布于 2017-02-02 字数 553 浏览 1025 回复 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;
}

发布评论

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

支持 Markdown 语法,需要帮助?

评论(3

虐人心 2017-10-06 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)

夜无邪 2017-07-14 2 楼

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

偏爱自由 2017-04-04 1 楼

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

输出:hellohelloworld!