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下通过测试的。
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下通过测试的。
相关文章推荐
- 实现memcpy、memcpy的优化、memmove、memset、strcpy、strncpy
- strcpy,memcpy,memmove,memset,strncpy
- strcpy,memcpy,memmove,memset,strncpy
- 关于memcpy、memset、memmove、strcpy、strncpy的使用
- strcat、strcmp、strcpy、strncpy、memset、memcpy、memmove和atoi函数源码
- memset(),memcpy(),memccpy(),memmove(),bcopy(),strcpy(),strncpy()
- strcpy,memcpy,memmove,memset,strncpy
- memset ,memcpy ,memmove,strcpy 的根本区别 与实现
- strcpy()、memcpy()、memmove()、memset()的内部实现
- strcpy()、memcpy()、memmove()、memset()的实现
- 几个重要库函数的实现-strcpy,strncpy,memcpy,memset
- strcpy()、memcpy()、memmove()、memset()的实现
- 手写几个重要的库函数 strcpy,strncpy,memcpy,memset
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset() 、strcmp()、strlen()、strcat()的实现
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数