深挖C语言:内存函数

📅 2026/8/19 12:45:17
深挖C语言:内存函数
目录1.memcpy函数代码演示模拟实现2.memmove函数代码演示模拟实现3.memset函数代码演示4.memcmp函数代码演示1.memcpy函数#includestring.h void* memcpy(void* destination , const void* source , size_t num);功能完成内存块拷贝不关注内存中存放的内容。从 source 的位置开始向后复制 num 个字节数据到 destination 指向的内存空间。注意如果 source 和 destination 有任何重叠复制的结果都是未定义的。num要拷贝的数据占据的字节数。返回值返回目标空间的起始地址。代码演示#includestdio.h #includestring.h int main() { int arr1[20] {0}; int arr2[10] {1,2,3,4,5,6,7,8,9,10}; memcpy(arr1,arr2,20); for(int i 0;i 10;i) printf(%d ,arr2[i]); printf(\n); return 0; }模拟实现void* my_memcpy(void* p1 , const void* p2 , size_t num) { // 校验指针是否为空 assert(p1 p2); //强转类型去除void*限制 void* ret p1; char* cp1 (char*)p1; const char* cp2 (const char*)p2; //内容拷贝 while(num--) { *cp1 *cp2; } return ret; }2.memmove函数#includestring.h void* memmove(void* destination , const void* source , size_t num);功能同memcpy函数完成内存的拷贝。差别memmove函数处理的源内存块和目标内存块是可以重叠的。代码演示#includestdio.h #includestring.h int main() { int arr[10] {1,2,3,4,5,6,7,8,9,10}; memmove(arr,arr2,20); for(int i 0;i 10;i) printf(%d ,*(arr i)); return 0; }模拟实现void* my_memmove(void* p1, const void* p2, size_t num) { //校验指针是否为空 arrert(p1 p2); //强转类型除去void*的限制 void* ret p1; char* cp1 (char*)p1; const char* cp2 (const char*)p2; //判断拷贝方向再交换 if (cp1 cp2 cp1 ! cp2) { //后-前 while (num--) { *(cp1 num) *(cp2 num); } return ret; } else { //前-后 while (num--) { *cp1 *cp2; } return ret; } }注指针比较大小最好当两个指针指向同一块连续的空间同一结构体或数组若不同数组、毫不相干的独立变量语法不会报错但是比较结果无意义。3.memset函数#includesting.h void* memset(void* ptr , int value , size_t num);功能设置内存块的内容将内存中指定长度的空间设置为特定的内容。参数ptr指针指向要设置的内存空间。value要设置的值函数会把 value 值转换为 unsigned char 的数据进行设置。也就是以字节为单位来设置内存块。num要设置的内存长度单位是字节。返回值返回的是要设置的内存空间的起始地址。代码演示#includestido.h #includestring.h int main() { int arr[10] {1,2,3,4,5,6,7,8,9,10}; memset(arr,0,20}; for(int i 0;i 10;i) printf(%d ,*(arr i)); return 0; }4.memcmp函数#includestring.h int memcmp(const void* ptr1 , const void* ptr2 , size_t num);功能比较指定的两块内存的大小比较从 ptr1 到 ptr2 指针指向的位置开始向后的num个字节。参数ptr1ptr2指针指向的两块待比较的内存。num指定的比较长度单位是字节。返回值ptr1 ptr2返回 0 的数字。ptr1 ptr2返回数字 0 。ptr1 ptr2返回 0 的数字。代码演示#includestdio.h #includestring.h int main() { int arr1[5] {1,2,3,4,5}; int arr2[5] {0,2,3,6,7}; int r1 memcmp(arr1,arr2,4); int r2 memcmp(arr11,arr21,8); int r3 memcmp(arr13,arr23,8); printf(r1 %d\n,r1); printf(r2 %d\n,r2); printf(r3 %d\n,r3); return 0; }最后感谢阅读欢迎交流与指正。