Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101562
  • 博文数量: 20
  • 博客积分: 1610
  • 博客等级: 上尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 16:05
文章分类

全部博文(20)

文章存档

2012年(1)

2011年(8)

2010年(11)

我的朋友

分类: 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
main()
{
char a[30]="string (a)";
char b[30]="string\0string";
int i;
strcpy(a,b);
printf("strcpy():");
for(i=0;i<30;i++)
printf("%c",a[i]);
memcpy(a,b,30);
printf("\nmemcpy() :");
for(i=0;i<30;i++)
printf("%c",a[i]);
}

执行

strcpy() : string a )
memcpy() : string string

  




memmove(拷贝内存内容)

相关函数

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的,内存区域没重叠的时候memcpymemmove实现的是一样的。在UBUNTU10下面执行memcpy竟然跟memmove结果一致。并没有像源码说的,memcpy无法处理内存区域重叠的问题,关于这点初步认为实现机制不同,的确将这个源码拷过去跟我们想象的是一致的。

阅读(1691) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~