memmove、memcpy、strcpy、memset的实现
2015-04-14 20:56
513 查看
memmove、memcpy、strcpy、memset
原型为:
void *memmove( void* dest, const void* src, size_t count );
char* strcpy(char* dest, const char* src);
void *memcpy(void *dest, const char* src, size_t count);
void* memset(void* dest, int value, size_t num)。
(1)strcpy提供了字符串的复制。
即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。
(2)memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。
(3)复制的内容不同。
strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。
(4)复制的方法不同。
strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。
(5)用途不同。
通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。
(6)memcpy只是memmove的一个子集,memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些。
[b]memcpy的实现:[/b]
strcpy的实现:
memmove的实现:
memset的实现:
原型为:
void *memmove( void* dest, const void* src, size_t count );
char* strcpy(char* dest, const char* src);
void *memcpy(void *dest, const char* src, size_t count);
void* memset(void* dest, int value, size_t num)。
(1)strcpy提供了字符串的复制。
即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。
(2)memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。
(3)复制的内容不同。
strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。
(4)复制的方法不同。
strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。
(5)用途不同。
通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。
(6)memcpy只是memmove的一个子集,memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些。
[b]memcpy的实现:[/b]
//size_t指的是unsigned int char* memcpy(void* dest,const void* src, size_t num) { char* p_dest = (char*)dest; const char* p_src = (const char*)src; assert((dest != NULL) && (src != NULL) && (dest != src)); while(num-- > 0) *p_dest++ = *p_src++; return dest; }
strcpy的实现:
char* strcpy(char* dest, const char* src) { assert((dest!=NULL) && (src!=NULL) && (dest!=src)); char* address = dest; while(*dest++ = *src++ ) NULL; return address; }
memmove的实现:
char* memmove(void* dest, const void* src,size_t num) { assert((dest!=NULL) && (src!=NULL) && (dest!=src)); char* p_dest = (char*)dest; const char* p_src = (const char*)src; if(p_dest > p_src && p_dest < p_src + num) //内存有重叠,逆向拷贝 { p_dest += num - 1; p_src += num - 1; while(num--) *p_dest-- = *p_src--; } else { //p_dest<=p_src,此时无论是否重叠都可以使用正向拷贝 while(num--) *p_dest++ = *p_src++; } return dest; }
memset的实现:
char* memset(void* dest, int value, size_t num) { assert(dest != NULL); unsigned char* p_dest = (unsigned char*)dest; while(num-- > 0) *p_dest++ = (unsigned char)value; return dest; }
相关文章推荐
- strcpy()、memcpy()、memmove()、memset()的内部实现
- strcpy()、memcpy()、memmove()、memset()的实现
- 函数实现-memcpy-strcpy-memmove-memset
- [转]strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- memcmp,memcpy,memmove,memset,strcat,strcmp,strcpy,strlen 8个函数的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy(),memcpy(),memmove(),memset(),strcmp(),strstr()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- 笔试题 字符串函数的实现(strcpy, strcat, strcmp, memset, memcpy, memmove)
- strcpy()、memcpy()、memmove()、memset()的内部实现
- 函数实现-memcpy-strcpy-memmove-memset
- strcpy()、memcpy()、memmove()、memset() 、strcmp()、strlen()、strcat()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- 转载:函数实现-memcpy-strcpy-memmove-memset
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现