硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1508|回复: 7
收起左侧

关于结构体内存连续问题?

[复制链接]

36

主题

142

回帖

250

积分

高级会员

积分
250
发表于 2022-5-18 10:48:05 | 显示全部楼层 |阅读模式
定义一个结构体 struct student{int num1,int num2,int num3}stu;struct stu Stu;for(i=0;i<3;i++){printf(“num:%d\n”,*(&Stu.name1 + sizeof(int)* i);)}这么用可以吗?会依次打印num1,num2,num3吗? struct里的元素类型是相同类型,因为需要不同命名不能用数组。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106638
QQ
发表于 2022-5-19 06:38:13 | 显示全部楼层
int的话,MDK为例会都是4字节对齐。
回复

使用道具 举报

75

主题

681

回帖

906

积分

金牌会员

积分
906
发表于 2022-5-19 23:34:20 | 显示全部楼层
首先,结构体写错了,第二你直接用*是个错误,编译器不知道你接下来是按int读取还是其他大小读取,第三直接取值和一个数值相加很多能被隐形类型转换,不安全甚至是错误。改为*(int *)((uint32_t)&Stu.num1 + sizeof(int) * i)。另外直接将Stu强转成int *更方便
回复

使用道具 举报

0

主题

58

回帖

58

积分

初级会员

积分
58
发表于 2022-5-27 12:27:55 | 显示全部楼层
结构体内部都是同一种数据类型是可以这样操作,但这样阅读不好
我一般是用联合体,联合体内有结构体和数组
[C] 纯文本查看 复制代码
union student
{
    struct 
    {
        int number1;
        int number2;
        int number3;
    };
    
    uint8_t bytes[12];
    uint32_t words[3];
}stu;
回复

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 2022-6-9 14:54:38 | 显示全部楼层
本帖最后由 emwin 于 2022-6-9 14:55 编辑

要点在这行,其他错误编译器会提示你:
[C] 纯文本查看 复制代码
printf("num:%d\n",*(&Stu.num1 + i));
回复

使用道具 举报

36

主题

142

回帖

250

积分

高级会员

积分
250
 楼主| 发表于 2022-10-21 11:30:08 | 显示全部楼层
emwin 发表于 2022-6-9 14:54
要点在这行,其他错误编译器会提示你:
[mw_shl_code=c,true]printf("num:%d\n",*(&Stu.num1 + i));[/mw_s ...

还是你理解我想说的重点,我想问一下这么用会有什么隐患吗?
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2022-10-24 17:22:20 | 显示全部楼层
不指定指针类型应该会报错, 或最起码会警告, 巨体这要看那家的编译
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2022-10-26 08:26:17 | 显示全部楼层
老师好! 想请教一下, 我做Modbus从机, 对主机写入的值做 限制(Min ~ Max)  目前我是初始化结构体时, 直接写好最大值 和 最小值 再比对写入值, 有没有啥好的思路
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 10:17 , Processed in 0.316417 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表