函数头文件
#include<string.h>
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
实例:
int main() { char* s = "csvdvdvsdvsdvdbdfs"; char d[20]; memcpy(d, s + 11, 6);// 从第 11 个字符(r)开始复制,连续复制 6 个字符 // 或者 memcpy(d, s+11*sizeof(char), 6*sizeof(char)); d[6] = '\0'; printf("%s", d); }
运行结果
dvdbfs
模拟实现memcpy函数
void * memcpy ( void * dst, const void * src, size_t count) { void * ret = dst; assert(dst); assert(src); while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } return(ret); }
二、memmove函数
void *memmove(void *str1, const void *str2, size_t n)
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
实例:
#include <stdio.h> #include <string.h> int main () { char str[] = "memmove can be very useful......"; memmove (str+20,str+15,11); puts (str); return 0; }
运行结果
memmove can be very very useful.
模拟实现memmove函数
解决拷贝覆盖问题
情况一:str在dest前
逆顺序拷贝,避免覆盖
情况二:str在dest后
顺顺序拷贝,避免覆盖
void* my_memmove(void* dest, void* src, int num) { assert(dest); assert(src); void* ret = dest; if (src > dest) { while (num--) { *(char*)dest == *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else { while (num--) { *((char*)dest + num) = *((char*)src + num); } } return ret; }