OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4266|回复: 5

结构体变量不能第一个初始化

[复制链接]

50

主题

94

帖子

0

精华

高级会员

Rank: 4

积分
556
金钱
556
注册时间
2020-3-6
在线时间
77 小时
发表于 2022-4-7 15:51:19 | 显示全部楼层 |阅读模式
1金钱
调试的时候发现一个奇怪的现象,头文件里声明了一个结构体类型,主程序中定义这个结构体全局变量并初始化,如果把这个初始化语句放在main函数前面全局区的第一句,编译不报错但运行结果明显错误;但如果将该初始化语句前面任意加一句,哪怕是一句不用的变量定义(比如int i;),编译运行就正常,这是什么道理?像这样写:

typedef struct
{
...
}test;    //声明结构体类型(在头文件里)

#include 头文件
test a = {...};   //定义并初始化结构体变量(放在全局区第一句)

int main(void)
{
过程中会用到结构体变量a
...
}
这样写编译正常,但运行结果不正常

改成下面这样:
typedef struct
{
...
}test;    //声明结构体类型(在头文件里)

#include 头文件
int i;       //这里任意加一句变量定义,哪怕这个变量是不用的
test a = {...};   //定义并初始化结构体变量(也就是把初始化语句不放在第一句

int main(void)
{
过程中会用到结构体变量a
...
}

这样写,编译运行都正常,换了不同的程序验证都是这样,是编译器的问题吗?

如果把定义初始化语句放main函数内部,也就是变成局部变量也是正常的。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2022-4-7 16:02:08 | 显示全部楼层
要么越界、要么对齐的问题
回复

使用道具 举报

0

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
711
金钱
711
注册时间
2015-5-23
在线时间
135 小时
发表于 2022-4-7 17:02:33 | 显示全部楼层
应该是字节对齐问题。
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2019-2-12
在线时间
28 小时
发表于 2022-4-8 10:22:05 | 显示全部楼层
运行结果明显错误是什么样的表现形式?结构体变量成员数值错误吗
回复

使用道具 举报

50

主题

94

帖子

0

精华

高级会员

Rank: 4

积分
556
金钱
556
注册时间
2020-3-6
在线时间
77 小时
 楼主| 发表于 2022-4-8 16:49:49 | 显示全部楼层
turelon 发表于 2022-4-8 10:22
运行结果明显错误是什么样的表现形式?结构体变量成员数值错误吗

我这个结构体是内容是LCD_GUI窗口菜单相关参数,放在第一句初始化,编译后运行根本就啥也不显示,放第二句初始化就显示正常
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2022-4-8 17:59:56 | 显示全部楼层
jeff001101 发表于 2022-4-8 16:49
我这个结构体是内容是LCD_GUI窗口菜单相关参数,放在第一句初始化,编译后运行根本就啥也不显示,放第二 ...

你的GUI是DMA刷新的吗?那可能是结构体首地址非4字节对齐问题。
态度决定一切
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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