硬汉嵌入式论坛

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

谨记,函数内部变量一定要初始化!!!

[复制链接]

1

主题

39

回帖

42

积分

新手上路

积分
42
发表于 2019-10-22 18:11:40 | 显示全部楼层 |阅读模式
今天发现了一个恐怖的问题,函数内部变量不初始化会栽跟头的例如
u8 fun(void)
{
u8 temp;
//函数内容
return temp;
}
变量 temp值不一定会为零,特别是程序量大,内存使用频繁的时候temp会变成其他值,返回值不一定会为0, 在函数内部使用过程中也会出问题,希望能引起大家注意。
正确的是这样的
u8 fun(void)
{
u8 temp=0; /*或者初始化为其他值*/
//函数内容
return temp;
}




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-10-23 08:37:21 | 显示全部楼层
对,局部变量是用的栈空间,每次申请的栈空间不会做初始化的。
回复

使用道具 举报

1

主题

39

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2019-10-24 11:36:41 | 显示全部楼层
这是一个让新手极其容易忽视的问题。不知道的就容易造成隐形BUG.
回复

使用道具 举报

3

主题

52

回帖

61

积分

初级会员

积分
61
发表于 2019-11-1 13:18:30 | 显示全部楼层
感谢分享。。。。。。。。。。
回复

使用道具 举报

0

主题

43

回帖

43

积分

新手上路

积分
43
发表于 2019-11-1 16:00:41 | 显示全部楼层
谢谢分享,学习了,局部变量以后要初始化操作。。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-3-27 18:10:14 | 显示全部楼层
eric2013 发表于 2019-10-23 08:37
对,局部变量是用的栈空间,每次申请的栈空间不会做初始化的。

全局变量是不是不需要初始化,默认就是零
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-3-28 09:57:57 | 显示全部楼层
honeybear 发表于 2020-3-27 18:10
全局变量是不是不需要初始化,默认就是零

一般情况下MDK和IAR会将全局变量做0初始化,规范些的话,推荐也初始化下。
回复

使用道具 举报

0

主题

105

回帖

105

积分

初级会员

积分
105
发表于 2020-3-28 18:09:13 | 显示全部楼层
honeybear 发表于 2020-3-27 18:10
全局变量是不是不需要初始化,默认就是零

根据运行平台和编译优化不同会有不同处理方式。有时候-O3就不会默认初始化。-DEBUG一般是会初始化为默认构造类型
这也是导致有些程序在高优化等级不能正常运行的原因之一
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 13:32 , Processed in 0.173838 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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