打印
[STM32F1]

结构体按位对齐后的赋值

[复制链接]
3644|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
slf123123|  楼主 | 2021-4-17 10:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 slf123123 于 2021-4-19 09:13 编辑

typedef unsigned long DWORD;

#pragma pack(push)
#pragma pack(1)
typedef struct si
{
    DWORD a:4;   
     DWORD b:7;  
    DWORD c:3;   
    DWORD d:1;                                                           

    DWORD e:3;      
    DWORD f:14;   
}si;
#pragma pack(pop)


如上所示这个结构体对齐后是四个字节

然后

uint8 buff[4];

怎么将buff赋值给整个结构体

struct  si su={buff[0],buff[1],buff[2],buff[3]};

这样赋值不行吗

使用特权

评论回复
沙发
zhamatu| | 2021-4-17 12:17 | 只看该作者
这样赋值是可以的,既可以整体赋值,也可以单独赋值的。前提是你的数组需要先定义。

使用特权

评论回复
评论
slf123123 2021-4-17 12:28 回复TA
buff必须是常量吗 可以是输入的变量吗 
板凳
slf123123|  楼主 | 2021-4-17 16:00 | 只看该作者

结构体按位对齐后的赋值

顶顶

使用特权

评论回复
地板
西门看雪| | 2021-4-17 21:32 | 只看该作者
我来告诉你就是不行,你定义的 uint8 buff[3]; 下标最多只能到 buff[2],请问你的 buff[3] 是哪里来的?必须是访问越界了嘛,要出大事情的。

使用特权

评论回复
5
yangjiaxu| | 2021-4-17 21:41 | 只看该作者
对,只能到buf【2】

使用特权

评论回复
6
slf123123|  楼主 | 2021-4-19 09:18 | 只看该作者
西门看雪 发表于 2021-4-17 21:32
我来告诉你就是不行,你定义的 uint8 buff[3]; 下标最多只能到 buff[2],请问你的 buff[3] 是哪里来的?必 ...

那个打错了。改了,就是表达的意思就是把这四个变量赋值给结构体 我用keil5编译出错
intnet\intnet.c(344): error:  #28: expression must have a constant value

使用特权

评论回复
7
xiaoqizi| | 2021-5-7 17:15 | 只看该作者
可以这样用结构体?

使用特权

评论回复
8
木木guainv| | 2021-5-7 17:17 | 只看该作者
如何进行按位对齐呢

使用特权

评论回复
9
八层楼| | 2021-5-7 17:23 | 只看该作者
这样赋值是可以的

使用特权

评论回复
10
观海| | 2021-5-7 17:25 | 只看该作者
访问已经越界了

使用特权

评论回复
11
guanjiaer| | 2021-5-7 17:26 | 只看该作者
是左对齐还是右对齐呢

使用特权

评论回复
12
heimaojingzhang| | 2021-5-7 17:27 | 只看该作者
这样赋值有点问题

使用特权

评论回复
13
keaibukelian| | 2021-5-7 17:27 | 只看该作者
结构体的长度如何确定呢

使用特权

评论回复
14
嵌入小菜菜| | 2021-5-7 23:15 | 只看该作者
这样做,是可以的。很不错的。

使用特权

评论回复
15
cuyebiren| | 2021-5-8 11:28 | 只看该作者
本帖最后由 cuyebiren 于 2021-5-8 11:34 编辑

*(DWORD *)&su = *(DWORD *)buff;           // 应该这样赋值。
si_t su = {buff[0], buff[1], buff[2], buff[3]};   // 这样赋值,只有 a, b, c, d 4个元素被赋值,而且只截取 buff[] 的对应的低几 bit
附上完整测试代码:
#include <stdio.h>
#include <stdint.h>

typedef unsigned long DWORD;
typedef struct si
{
    DWORD a:4;
    DWORD b:7;
    DWORD c:3;
    DWORD d:1;

    DWORD e:3;
    DWORD f:14;
}si_t;

#define SET_DWORD(dest, src)    *(DWORD *)&(dest) = *(DWORD *)&(src)

uint8_t buff[4] = {0xFF, 0xFF, 0xFF, 0xFF};

int main()
{
    //si_t su = {buff[0], buff[1], buff[2], buff[3]};
    si_t su;
    *(DWORD *)&su = *(DWORD *)buff;
    //SET_DWORD(su, buff[0]);

    printf("0x%X\n",su.a);
    printf("0x%X\n",su.b);
    printf("0x%X\n",su.c);
    printf("0x%X\n",su.d);
    printf("0x%X\n",su.e);
    printf("0x%X\n",su.f);

    return 0;
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

0

粉丝