打印
[C语言]

main函数内定义的变量是在栈上吗

[复制链接]
738|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FAQ|  楼主 | 2022-3-24 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有个程序调试很久一直数据异常,后来无意发现main函数内定义的变量定义在main以外后程序功能正常了。


我分析原因可能是:main函数内定义的变量属于函数局部变量,局部变量保存在栈中,main中有后续程序意外改变了栈里的值,导致这个定义在main内的变量值发生了意外改变


uint32_t i; 
int main(void)
{
   
……
}
int main(void)
{
    uint32_t i;
……
}


使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2022-3-24 10:30 | 只看该作者
这只能说明暂时避开的错误,程序本身可能还是有问题,标准的C是通过堆栈分配局部非静态变量的,

使用特权

评论回复
板凳
jack821119| | 2022-3-24 11:30 | 只看该作者
程序本身有问题,堆栈的数据被意外改写了。可以将栈的大小增加,这样估计不会再出现问题了。

使用特权

评论回复
地板
FAQ|  楼主 | 2022-3-24 11:44 | 只看该作者
jack821119 发表于 2022-3-24 11:30
程序本身有问题,堆栈的数据被意外改写了。可以将栈的大小增加,这样估计不会再出现问题了。 ...

RAM空间很小,我差不多都是省着用的,以至于栈的大小我也是省着设的


变量设置成全局变量以后目前暂时程序工作正常,应该不会有什么问题了

使用特权

评论回复
5
szleg| | 2022-3-24 19:08 | 只看该作者
也有可能是中断处理时,main函数的局部变量没有压入堆栈,而中断程序刚好使用了该变量的ram空间。新人瞎猜的

使用特权

评论回复
6
full_stack| | 2022-3-25 09:32 | 只看该作者
堆栈不够用,编译器会提醒你吧?
main函数定义的局部变量被改变,或许是程序有重启?

使用特权

评论回复
7
ddxx| | 2022-3-27 06:33 | 只看该作者
局部变量都入栈的,全局变量都是编译时分配的。估计栈太小。

使用特权

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

本版积分规则

FAQ

224

主题

1995

帖子

9

粉丝