您的位置:首页 > 其它

strcpy,memcpy,memmove,memset,strncpy

2011-11-09 10:37 567 查看
来自: http://hi.baidu.com/lkmoses/blog/item/3c553dc4778701169c163d57.html
strcpy,memcpy,memmove,memset,strncpy,

一.函数分别介绍:

1、memcpy:

原型:extern void *memcpy(void *dest, const void *src, unsigned int count);

用法:#include<string.h>

功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

注意:和strcpy相比,memcpy不是遇到’\0’就结束,而是一定会拷贝完n个字节。

2、memset:

函数原型:

extern void *memset(void *s, int c, size_t n)

功能:将已开辟内存空间s的首n个字节的值设为值c。将s中的前n个字符替换为c,并返回s。

memset常用于内存空间的初始化。

memset的深刻内涵:用来对一段内科空间全部设置为某个字符,一般用在对定义的字符串进行初始化为:memset(a, ‘\0’, sizeof(a));

3、void *memmove(void *s, const void *ct, size_t n)

与memcpy类似,所不同的是,当对象重叠时,该函数仍能正确执行

4、strncpy(s, t, n)

把t指向的字符串中前n个字符复制到s指向的位置。

二.下面重点来讲解memcpy和memmove的区别:

这两个函数的函数原型(除了名字)是一样的:

void *memcpy(void *dst, const void *src, size_t count):

void *memmove(void *dst, const void *src, size_t count);

它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果都是一样的。但有交叉时不一样。源内存和目标内存交叉的情况有以下两种:(左边为低地址)

1、



即:dst<=src 且 dst+count>src

2、



即:src<dst且src+count>dst

下面将针对这两种情况来讨论。针对第一种交叉情况情况,dst<src且dst+count>src,memcpy和memmove的结果是一样的。请看下面的例子讲解:

int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

memcpy(a, a+4, sizeof(int)*6);和memmove(a, a+4, sizeof(int)*6);结果是:

4567896789



针对第二种情况,src<dst且src+count>dst,memcpy和memmove的结果是不一样的。请看下面的例子:

int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

memcpy(a+4, a, sizeof(int)*6)



memmove(a+4, a, sizeof(int)*6)



下面是这两个函数的具体实现:

void *memcpyMy(void *dst, const void *src, size_t count){

void *address = dst;

while (count)

{

*(char *)address = *(char *)src;

address = (char *)address + 1;

src = (char *)src + 1;

count --;

}

return dst;

}

void *memmoveMy(void *dst, const void *src, size_t count){

void *address = dst;

if (dst <= src || (char*)dst >= (char *)src + count)

{

while (count --)

{

*(char *)address = *(char *)src;

address = (char *)address + 1;

src = (char *)src + 1;

}

}else{

address = (char *)address + count - 1;

src = (char *)src + count - 1;

while (count --)

{

*(char *)address = *(char *)src;

address = (char *)address - 1;

src = (char *)src - 1;

}

}

return dst;

}

以上两段代码是在vc6.0下通过测试的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: