这篇博客将会总结部分C语言内存函数,如memcpy,memmove,memset,memcmp的相关说明
希望可以获得伙伴们的支持!!!
以下将的所有函数使用都要包含头文件<string.h>
目录
1.memcpy
使用举例
模拟实现
2.memmove
使用举例
模拟实现
3.memset
使用举例
编辑
4.memcmp
使用举例
1.memcpy
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到 '\0' 的时候并不会停下来。source和destination有任何的重叠,复制的结果都是未定义的。目的空间大小一定要能容纳memcpy所拷贝的内容,如果拷贝在内容超过目的空间大小,会导致溢出。
使用举例
可见,这个函数并没有在源字符串后面加' \0 ' ,所以后面的xxxxx还能输出
模拟实现
#include<stdio.h>#include<assert.h>void* my_memcpy(void* destination, const void* source, size_t num);int main(){int i;int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 11,12,13,14,15,16,17,18,19,20 };my_memcpy(arr1+2, arr2, 20);for (i = 0; i < 20; i++){printf("%d ", arr1[i]);}printf("\n");return 0;}void* my_memcpy(void* destination, const void* source, size_t num){assert(destination && source);void* ret = destination;while (num--){*(char*)destination = *(char*)source;destination = (char*)destination + 1;source = (char*)source + 1;}return ret;}
由于复制类型不确定,所以统一强转为最小字节的char类型进行拷贝
2.memmove
memcpy和memmove很相似,不同于memcpy,memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。使用举例
模拟实现
#include<stdio.h>void* my_memmove(void* destination, const void* source, size_t num);int main(){int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1+3 , arr1, 20);int i;for (i = 0; i < 20; i++){printf("%d ", arr1[i]);}printf("\n");return 0;}void* my_memmove(void* destination, const void* source, size_t num){void* ret = destination;if (destination < source){while(num--){*(char*)destination = *(char*)source;destination = (char*)destination + 1;source = (char*)source + 1;}}else {while (num--) {*((char*)destination + num) = *((char*)source + num);}}}
这里分为if-else是要考虑目标区域与源区域的前后顺序,以防复制出现问题