搜索

[STM32F1] 结构体按位对齐后的赋值

[复制链接]
1505|15
 楼主 | 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]};

这样赋值不行吗

使用特权

评论回复
| 2021-4-17 12:17 | 显示全部楼层
这样赋值是可以的,既可以整体赋值,也可以单独赋值的。前提是你的数组需要先定义。

使用特权

评论回复

评论

slf123123 2021-4-17 12:28 回复TA
buff必须是常量吗 可以是输入的变量吗 
 楼主 | 2021-4-17 16:00 | 显示全部楼层

结构体按位对齐后的赋值

顶顶

使用特权

评论回复
| 2021-4-17 21:32 | 显示全部楼层
我来告诉你就是不行,你定义的 uint8 buff[3]; 下标最多只能到 buff[2],请问你的 buff[3] 是哪里来的?必须是访问越界了嘛,要出大事情的。

使用特权

评论回复
| 2021-4-17 21:41 | 显示全部楼层
对,只能到buf【2】

使用特权

评论回复
 楼主 | 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

使用特权

评论回复
| 2021-5-7 17:15 | 显示全部楼层
可以这样用结构体?

使用特权

评论回复
| 2021-5-7 17:17 | 显示全部楼层
如何进行按位对齐呢

使用特权

评论回复
| 2021-5-7 17:23 | 显示全部楼层
这样赋值是可以的

使用特权

评论回复
| 2021-5-7 17:25 | 显示全部楼层
访问已经越界了

使用特权

评论回复
| 2021-5-7 17:26 | 显示全部楼层
是左对齐还是右对齐呢

使用特权

评论回复
| 2021-5-7 17:27 | 显示全部楼层
这样赋值有点问题

使用特权

评论回复
| 2021-5-7 17:27 | 显示全部楼层
结构体的长度如何确定呢

使用特权

评论回复
| 2021-5-7 23:15 | 显示全部楼层
这样做,是可以的。很不错的。

使用特权

评论回复
| 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
附上完整测试代码:
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. typedef unsigned long DWORD;
  4. typedef struct si
  5. {
  6.     DWORD a:4;
  7.     DWORD b:7;
  8.     DWORD c:3;
  9.     DWORD d:1;

  10.     DWORD e:3;
  11.     DWORD f:14;
  12. }si_t;

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

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

  15. int main()
  16. {
  17.     //si_t su = {buff[0], buff[1], buff[2], buff[3]};
  18.     si_t su;
  19.     *(DWORD *)&su = *(DWORD *)buff;
  20.     //SET_DWORD(su, buff[0]);

  21.     printf("0x%X\n",su.a);
  22.     printf("0x%X\n",su.b);
  23.     printf("0x%X\n",su.c);
  24.     printf("0x%X\n",su.d);
  25.     printf("0x%X\n",su.e);
  26.     printf("0x%X\n",su.f);

  27.     return 0;
  28. }
复制代码


使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表