分类: C/C++
2010-10-04 21:07:13
#include
int main()
{
char a[]="123456789";
char b[]="123456789";
printf("%s\n",a);
memcpy(a+2,a,3);
printf("%s\n",a);
memmove(b+2,b,3);
printf("%s\n",b);
}
上一段代码在UBUNTU10.04中结果是
123456789
121236789
121236789
而在CENTOS4.8和在ubuntu9.10中的结果是
123456789
121216789
121236789
memcpy(拷贝内存内容) | ||
相关函数 |
bcopy,memccpy,memcpy,memmove,strcpy,strncpy | |
表头文件 |
#include | |
定义函数 |
void * memcpy (void * dest ,const void *src, size_t n); | |
函数说明 |
memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束。 | |
返回值 |
返回指向dest的指针。 | |
附加说明 |
指针src和dest所指的内存区域不可重叠。 | |
范例 |
#include | |
执行 |
strcpy() : string a ) | |
| ||
|
| |
相关函数 |
bcopy,memccpy,memcpy,strcpy,strncpy | |
表头文件 |
#include | |
定义函数 |
void * memmove(void *dest,const void *src,size_t n); | |
函数说明 |
memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。 | |
返回值 |
返回指向dest的指针。 | |
附加说明 |
指针src和dest所指的内存区域可以重叠。 | |
范例 |
参考memcpy()。 |
#ifndef __HAVE_ARCH_MEMMOVE
/**
* memmove - Copy one area of memory to another
* @dest: Where to copy to
* @src: Where to copy from
* @count: The size of the area.
*
* Unlike memcpy(), memmove() copes with overlapping areas.
*/
void *memmove(void *dest, const void *src, size_t count)
{
char *tmp;
const char *s;
if (dest <= src) {
tmp = dest;
s = src;
while (count--)
*tmp++ = *s++;
} else {
tmp = dest;
tmp += count;
s = src;
s += count;
while (count--)
*--tmp = *--s;
}
return dest;
}
EXPORT_SYMBOL(memmove);
#endif
#ifndef __HAVE_ARCH_MEMCPY
/**
* memcpy - Copy one area of memory to another
* @dest: Where to copy to
* @src: Where to copy from
* @count: The size of the area.
*
* You should not use this function to access IO space, use memcpy_toio()
* or memcpy_fromio() instead.
*/
void *memcpy(void *dest, const void *src, size_t count)
{
char *tmp = dest;
const char *s = src;
while (count--)
*tmp++ = *s++;
return dest;
}
EXPORT_SYMBOL(memcpy);
#endif
从上面可以看出来,当内存区域有重叠的时候memmove是从高往低开始copy的,内存区域没重叠的时候memcpy和memmove实现的是一样的。在UBUNTU10下面执行memcpy竟然跟memmove结果一致。并没有像源码说的,memcpy无法处理内存区域重叠的问题,关于这点初步认为实现机制不同,的确将这个源码拷过去跟我们想象的是一致的。