C语言数据结构笔记6:使用宏和指针来设置和操作嵌套在结构体中的联合体数组的特定位
使用宏和指针来设置和操作嵌套在结构体中的联合体数组的特定位
目录
直接贴代码了:
直接贴代码了:
主要时要注意在嵌入式开发中,指针的使用
需要申请内存,然后及时释放
指针使用前后也要及时指向NULL
否则,它指向地址的值可能会被改变、清零,乃至程序直接卡死都有可能
#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; }