strcpy,memcpy,memmove,memset,strncpy
2010-09-12 21:09
459 查看
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
- strcpy()、memcpy()、memmove()、memset()的实现
- 手写几个重要的库函数 strcpy,strncpy,memcpy,memset
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- memset ,memcpy ,memmove,strcpy 的根本区别 与实现
- strcpy()、memcpy()、memmove()、memset()的内部实现
- strcpy()、memcpy()、memmove()、memset()的实现
- 几个重要库函数的实现-strcpy,strncpy,memcpy,memset
- std::strcpy、strncpy、memset、memcpy用法
- strcpy()、memcpy()、memmove()、memset()的实现
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数