使用宏和指针来设置和操作嵌套在结构体中的联合体数组的特定位

目录
直接贴代码了:
主要时要注意在嵌入式开发中,指针的使用
需要申请内存,然后及时释放
指针使用前后也要及时指向NULL
否则,它指向地址的值可能会被改变、清零,乃至程序直接卡死都有可能
cpp#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdint.h> // 确保包含此头文件以使用 uint8_t // 定义宏来设置特定位 #define SET_BIT(reg_ptr, bit) ((reg_ptr)->byte |= (1 << (bit))) // 定义宏来清除特定位 #define CLEAR_BIT(reg_ptr, bit) ((reg_ptr)->byte &= ~(1 << (bit))) typedef union { uint8_t byte; // 整个字节数组访问 struct { uint8_t b0 : 1; uint8_t b1 : 1; uint8_t b2 : 1; uint8_t b3 : 1; uint8_t b4 : 1; uint8_t b5 : 1; uint8_t b6 : 1; uint8_t b7 : 1; } bits; } _02_regs; typedef struct MB_Funccode_regs { _02_regs Failure_Malfunction[15]; // 故障异常 //0x03e8 - 0x045f (120个元素) // 假设 _04_regs_A 定义在其他地方 } MB_regs; MB_regs test_regs; int main() { uint16_t start_addr; _02_regs *reg_ptr = NULL; reg_ptr = (_02_regs *)malloc(sizeof(_02_regs)); reg_ptr = &test_regs.Failure_Malfunction[0]; // 设置第0个字节 start_addr =1; // 清除第0个字节的第1位 SET_BIT(reg_ptr,(start_addr - 0)%8); // 打印结果以验证 printf("Byte 0 _ bit 1: 0x%02X\n", test_regs.Failure_Malfunction[0].byte); reg_ptr = NULL; free(reg_ptr); return 0; }