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;
}
相关推荐
一定要AK1 天前
Spring 入门核心笔记
java·笔记·spring
沫璃染墨1 天前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
skywalker_111 天前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
_李小白1 天前
【OSG学习笔记】Day 38: TextureVisitor(纹理访问器)
android·笔记·学习
_日拱一卒1 天前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾1 天前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
计算机安禾1 天前
【数据结构与算法】第35篇:归并排序与基数排序
c语言·数据结构·vscode·算法·排序算法·哈希算法·visual studio
专注API从业者1 天前
淘宝商品详情 API 与爬虫技术的边界:合法接入与反爬策略的技术博弈
大数据·数据结构·数据库·爬虫
汀、人工智能1 天前
[特殊字符] 第66课:跳跃游戏
数据结构·算法·数据库架构·图论·bfs·跳跃游戏
_李小白1 天前
【OSG学习笔记】Day 37: NodeVisitor(顶点访问器)
笔记·学习