C语言彻底搞懂四大内存操作函数 (memcpy/memmove/memset/memcmp)我是 Gemini今天化身你的「C语言总结者」。在C语言的学习旅途中字符串函数我们经常用但遇到非字符串的数组或结构体时常常会感到捉襟见肘。今天我们就来系统地复盘一下第18讲的内容C语言内存函数。这篇博客不仅会带你回顾基础用法还会帮你拆解底层逻辑专治各种“记不住”和“容易混”1. memcpy简单粗暴的内存搬运工核心功能memcpy的主要任务是完成内存块拷贝它完全不关注内存中存放的数据类型是什么。只要你给它起始地址和字节数它就老老实实地搬砖。函数从source的位置开始向后复制num个字节的数据到destination指向的内存位置。使用它必须包含头文件string.h。函数原型与参数记忆法void*memcpy(void*destination,constvoid*source,size_tnum); 总结者的独家记忆心法很多同学老是把destination和source的位置写反。你可以这样记“左边是VIP目标座右边是普通源头座”。destination指向目标空间即数据最终要存放的“新家”。source指向源空间即要拷贝的数据“老家”。注意它前面加了const保护伞意味着源头数据是只读的不会被意外篡改。num要拷贝的具体字节数千万别记成元素个数。返回值拷贝完成后返回目标空间的起始地址。实战代码示例#includestdio.h#includestring.hintmain(){intarr1[]{1,2,3,4,5,6,7,8,9,10};intarr2[10]{0};// 把 arr1 的前 20 个字节拷贝到 arr2 中memcpy(arr2,arr1,20);for(inti0;i10;i){printf(%d ,arr2[i]);}return0;}⚠️ 致命痛点内存重叠的未定义行为memcpy虽然好用但它是个“直肠子”。如果你让它拷贝的源空间和目标空间有任何的重叠复制的结果都是未定义的对于这种情况我们需要请出下一位大佬memmove。2. memmove重叠内存的救星核心功能memmove同样用于完成内存块拷贝。它和memcpy的唯一差别也是最大的杀手锏就是它能够安全地处理源内存块和目标内存块重叠的情况。同样需要包含string.h。参数和返回值与memcpy完全一致。实战代码示例#includestdio.h#includestring.hintmain(){intarr1[]{1,2,3,4,5,6,7,8,9,10};// 将 arr1 的内容拷贝到 arr12 的位置发生内存重叠memmove(arr12,arr1,20);for(inti0;i10;i){printf(%d ,arr1[i]);}return0;} 总结者的底层逻辑分析它是如何解决重叠的在模拟实现memmove时核心策略是判断地址的高低以决定拷贝方向从前向后拷贝从低地址到高地址当目标地址小于等于源地址或者完全没有重叠时。从后向前拷贝从高地址到低地址当目标地址大于源地址且发生重叠时。这种逆向拷贝保护了尚未被拷贝的源数据不被提前覆盖。3. memset内存初始化神器核心功能memset函数的作用是设置内存块的内容它可以将内存中指定长度的空间统一设置为特定的内容。void*memset(void*ptr,intvalue,size_tnum);参数深度解析需要包含string.h。ptr指向要设置的内存空间的起始地址。value要设置的值。注意函数会把这个值转换成unsigned char进行设置。num要设置的内存长度单位是字节。返回值返回要设置的内存空间的起始地址。 总结者的避坑指南当有一块内存空间需要设置内容的时候就可以使用memset函数值得注意的是memset函数对内存单元的设置是以字节为单位的。如果给int的每个字节都设为1这个int最终的值会变成0x01010101根本不是1实战代码演示#includestdio.h#includestring.hintmain(){charstr[]hello world;// 将 str 的前 6 个字节设置为 xmemset(str,x,6);printf(%s\n,str);return0;}4. memcmp不挑食的内存比较器核心功能比较指定的两块内存块的内容比较从ptr1和ptr2指针指向的位置开始向后的num个字节。需要包含string.h头文件。intmemcmp(constvoid*ptr1,constvoid*ptr2,size_tnum);返回值潜规则memcmp是通过返回值告知大小关系的。它会将比较的字节作为unsigned char评估返回值 0在两个内存块中遇到第一个不匹配的字节时ptr1中的值小于ptr2中的值。返回值 0两块内存的内容完全相等。返回值 0遇到第一个不匹配的字节时ptr1中的值大于ptr2中的值。实战代码演示#includestdio.h#includestring.hintmain(){charbuffer1[]DWga0tP12df0;charbuffer2[]DWGAOTP12DF0;// 比较两个缓冲区的大小intnmemcmp(buffer1,buffer2,sizeof(buffer1));if(n0)printf(%s 大于 %s.\n,buffer1,buffer2);elseif(n0)printf(%s 小于 %s.\n,buffer1,buffer2);elseprintf(%s 和 %s 一样.\n,buffer1,buffer2);return0;} 总结者的提示如果要比较2块内存单元的数据的大小可以使用memcmp函数这个函数的特点就是可以指定比较长度。学习结语以上就是C语言中最核心的四个内存操作函数总结。掌握它们你的C语言基本功将更上一层楼。建议大家在编译器里亲手把上面的模拟实现逻辑敲一遍理解了底层的指针转换和字节偏移以后再用这些函数就能游刃有余了