C语言数据结构笔记6:使用宏和指针来设置和操作嵌套在结构体中的联合体数组的特定位

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

目录

直接贴代码了:

直接贴代码了:

主要时要注意在嵌入式开发中,指针的使用

需要申请内存,然后及时释放

指针使用前后也要及时指向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;
}
相关推荐
charlie1145141913 分钟前
设计自己的小传输协议 导论与概念
c++·笔记·qt·网络协议·设计·通信协议
邹诗钰-电子信息工程21 分钟前
嵌入式基础知识复习(C语言)
linux·c语言·vim
吴烦恼的博客31 分钟前
FSMC的配置和应用
c语言·单片机·fsmc
伍哥的传说40 分钟前
React & Immer 不可变数据结构的处理
前端·数据结构·react.js·proxy·immutable·immer·redux reducers
xiaoli23271 小时前
课题学习笔记3——SBERT
笔记·学习·nlp·bert
XH华2 小时前
C语言第六章函数递归
c语言·开发语言·算法
程序员编程指南3 小时前
Qt 并行计算框架与应用
c语言·数据库·c++·qt·系统架构
ZTLJQ3 小时前
专业Python爬虫实战教程:逆向加密接口与验证码突破完整案例
开发语言·数据结构·爬虫·python·算法
Magnetic_h3 小时前
【iOS】类和分类的加载过程
笔记·学习·ios·objective-c·xcode
努力的小帅4 小时前
C++_红黑树树
开发语言·数据结构·c++·学习·算法·红黑树