👑个人主页:啊Q闻
🎇收录专栏:《C语言》
🎉道阻且长,行则将至
前言
这篇博客是关于C语言内存函数(memcpy,memmove,memset,memcmp)的使用以及部分的模拟实现
memcpy,memmove,memset,memcmp的头文件都为string.h
一.memcpy使用及模拟实现
1.使用
注1:使用void*的原因:拷贝的数据可能为结构体,字符等其他类型数据。
注2:函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内 存位置中
注3:这个函数在遇到'\0'时不会停下来。
注4:memcpy是用于不重叠的数组之间的拷贝
代码运行:
也可以从数组中间元素开始拷贝:
2.模拟实现
void* my_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;assert(dest);assert(src);while (num--){*(char*)dest = *(char*)src;//void*要强制性转化成其他类型才可以计算dest = (char*)dest+1;src = (char*)src + 1;//强制性转化只是暂时的,所以加一时也要进行强制转换}return ret;
}
二.memmove的使用及模拟实现
1.使用
注1:memmove和memcpy的差别就是memmove函数处理的源内存块和目的内存块是可以重叠的
运行过程:
在arr1+3处即元素4的前面开始插入源内存块,将arr1中的3个元素拷贝到arr1中,结果如下:
2.模拟实现
void* my_memmove(void* dest, void* src, size_t num)
{void* ret = dest;if (dest <= src )//c从前向后拷贝{while (num--){*(char*)dest = *(char*)src;dest=(char*)dest + 1;src = (char*)src + 1;}}else//从后向前拷贝{dest = (char*)dest + num - 1;//找到空间末位置src = (char*)src + num-1;//找到空间末位置while (num--){*(char*)dest = *(char*)src;dest = (char*)dest -1;src = (char*)src -1;}}return ret;
}
详解:
当dest于src两个空间不重叠时,从前向后拷贝或是从后向前拷贝都可以。
三.memset的使用
memset函数是用于设置内存的,其单位为字节
运行过程:
四.memcmp的使用
比较从ptr1ptr2指向的位置开始,向后的num个字节,单位是字节
返回值为:
运行过程:
文章到这里就结束了,感谢阅读,如果对你有帮助的话,给个三连支持一下吧