void* memcpy(void* dest , void* src, size_t length)函数:函数从src的起始位置复制length个字节到dest的内存起始位置,它并不关心数据类型,只是逐字节的进行复制。
注意点:
1、dest指针要分配足够的空间,大于或等于 length个字节的空间。如果没有分配空间,会出现断错误。
2、dest和src所指的内存空间不能重叠。即dest < src 或 dest > src+length
源码:
void memcpy (void* dest , const void* src , size_t length) {
assert(src);
char* pdest = (char*)pdest;
const char* psrc = (const char*)src;
while(length--) {
*pdest = *psrc;
pdest++;
psrc++;
}
}
memcpy函数并不关系数据类型,它只是逐字节的复制。
memmove(void* dst,void const * src,size_t length)函数:
与memcpy功能一样,只是这里它会考虑内存重叠的问题,当src和dest存在重叠时,它同样可以正确处理,不过执行效率会比memcpy慢一些。
源码:
void* memmove (void* dst , void const * src , size_t length) {
char * tmp;
char * s;
if (dst < src || dst > src+length) {
tmp = dst ;
s = src ;
while (length--){
*tmp = *s;
tmp++;s++;
} else {
//存在内存重叠,从尾向前开始拷贝
tmp = dst;
tmp += count;
s = src;
s += count;
while (length--) {
*tmp = *s;
tmp--; s--;
}
}
}
return dst;
}
注意点:
void* 类型是不能进行计算的,必须转换为char*
void* memset(void* a, int ch , size_t length)函数
函数memset是从a开始的length个字节都设置成字符ch,memset可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符串数组。逐字节拷贝。万能的初始化工具。
源码:
void* memset ( void* dest , int ch , size_t length) {
const unsigned char uc = ch;
char* su;
for ( su=dest ; length>0 ; su++,length--) {
*su = ch;
}
return dest;
}
memset函数是逐字节拷贝,利用memset进行初始化复制比手动复制要快的多,适合于进行初始化。
使用memset的时候要格外小心,在给char以外的数据赋值时,只能初始化为0或者-1;