stm20260710 STM32_HAL库C语言内存相关函数详细说明和使用笔记
stm20260710 STM32_HAL库C语言内存相关函数详细说明和使用笔记一、内存操作函数1.1 memcpy - 内存拷贝原型void *memcpy(void *dest, const void *src, size_t n);功能从源地址src拷贝n个字节到目标地址dest。注意源和目标内存区域不能重叠否则行为未定义。#includestdio.h#includestring.hintmain(void){// 示例1拷贝数组uint8_tsrc{0xA5,0xA8,0x02,0x20,0x07,0x01,0x00,0x00};uint8_tdest;memcpy(dest,src,sizeof(src));printf(dest: );for(inti0;i8;i){printf(%02X ,dest[i]);}// 输出: A5 A8 02 20 07 01 00 00printf(\n);// 示例2拷贝结构体typedefstruct{uint32_tid;floatvalue;}Sensor_t;Sensor_t s1{.id1,.value36.5f};Sensor_t s2;memcpy(s2,s1,sizeof(Sensor_t));printf(s2.id%lu, s2.value%.1f\n,s2.id,s2.value);// 输出: s2.id1, s2.value36.5return0;}1.2 memmove - 安全内存拷贝原型void *memmove(void *dest, const void *src, size_t n);功能与memcpy相同但正确处理内存重叠的情况。#includestdio.h#includestring.hintmain(void){// 示例1内存重叠时向右移动charstr[]Hello, STM32!;printf(原始: %s\n,str);// 将整体向右移动3个字节重叠场景memmove(str3,str,strlen(str)1);// 1 拷贝 \0str;str;str;printf(右移: %s\n,str);// 输出: Hello, STM32!// 示例2环形缓冲区数据搬移uint8_tbuffer{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};// 将后4个字节移到前面覆盖前4个字节memmove(buffer,buffer4,4);printf(搬移后: );for(inti0;i8;i){printf(%02X ,buffer[i]);}// 输出: 05 06 07 08 05 06 07 08printf(\n);return0;}1.3 memset - 内存初始化原型void *memset(void *s, int c, size_t n);功能将内存块s的前n个字节设置为值c按字节填充。#includestdio.h#includestring.hintmain(void){// 示例1数组清零uint8_tbuffer;memset(buffer,0,sizeof(buffer));printf(清零后: );for(inti0;i16;i){printf(%02X ,buffer[i]);}// 输出: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00printf(\n);// 示例2结构体清零typedefstruct{uint32_tid;uint8_tname;floattemp;}Device_t;Device_t dev;memset(dev,0,sizeof(Device_t));printf(dev.id%lu, dev.temp%.1f\n,dev.id,dev.temp);// 输出: dev.id0, dev.temp0.0// 示例3填充特定值注意是按字节填充uint8_tfill_buf;memset(fill_buf,0xFF,sizeof(fill_buf));printf(填充0xFF: );for(inti0;i8;i){printf(%02X ,fill_buf[i]);}// 输出: FF FF FF FF FF FF FF FFprintf(\n);// ⚠️ 错误示例memset 不能正确填充多字节值uint32_tarr;memset(arr,1,sizeof(arr));// 每个字节被设为0x01所以每个uint32_t 0x01010101// 而不是你期望的 0x00000001printf(arr0x%08lX\n,arr);// 输出: arr0x01010101return0;}1.4 memcmp - 内存比较原型int memcmp(const void *s1, const void *s2, size_t n);功能逐字节比较两块内存的前n个字节。返回值0相同0s1较小0s1较大。#includestdio.h#includestring.hintmain(void){// 示例1比较两个数组是否相同uint8_tframe1[]{0xA5,0xA8,0x02,0x20};uint8_tframe2[]{0xA5,0xA8,0x02,0x20};uint8_tframe3[]{0xA5,0xA8,0x02,0x30};if(memcmp(frame1,frame2,4)0){printf(frame1 和 frame2 完全相同\n);}// 输出: frame1 和 frame2 完全相同if(memcmp(frame1,frame3,4)!0){printf(frame1 和 frame3 不同\n);}// 输出: frame1 和 frame3 不同// 示例2协议帧头匹配uint8_trx_data[]{0xA5,0xA8,0x02,0x20,0x07,0x01};uint8_theader[]{0xA5,0xA8};if(memcmp(rx_data,header,2)0){printf(帧头匹配成功是有效帧\n);}// 输出: 帧头匹配成功是有效帧// 示例3比较大小关系uint8_ta[]{0x01,0x02,0x03};uint8_tb[]{0x01,0x02,0x04};intresultmemcmp(a,b,3);if(result0){printf(a b\n);}// 输出: a breturn0;}1.5 memchr - 内存查找字符原型void *memchr(const void *s, int c, size_t n);功能在内存块s的前n个字节中查找第一个等于c的字节。返回值找到返回指向该字节的指针未找到返回NULL。#includestdio.h#includestring.hintmain(void){// 示例1在数据中查找特定字节uint8_tdata[]{0x01,0x02,0x03,0xA5,0x05,0x06};uint8_t*found(uint8_t*)memchr(data,0xA5,sizeof(data));if(found!NULL){intoffsetfound-data;printf(找到 0xA5位于偏移量 %d\n,offset);}// 输出: 找到 0xA5位于偏移量 3// 示例2查找不存在的字节uint8_t*not_found(uint8_t*)memchr(data,0xFF,sizeof(data));if(not_foundNULL){printf(未找到 0xFF\n);}// 输出: 未找到 0xFF// 示例3在字符串中查找字符类似 strchr 但指定长度charstr[]Hello, STM32 World!;char*comma(char*)memchr(str,,,strlen(str));if(comma!NULL){printf(逗号位置:%d