• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

变量初始化问题

fighter-12315 2018-03-09 浏览量:805

在以前我刚接触单片机的时候,不对,应该说刚接触C语言时,申明一个变量后不赋值会默认赋值0,于是我在写单片机代码时经常都是申明变量后不赋值的,无论是51还是stm32,好像都没遇到过什么问题,而去年我用K60单片机做智能车时发现不赋值会发生许多莫名其妙的问题,不赋值程序就会奔溃卡死,但是同样M4内核我用stm32f4不赋值也没遇到过什么问题啊,讲道理这俩货的不同之处只是不同厂商所加的外设不同而已吧有没有遇到跟我一样问题的小伙伴,能不能帮我解释解释

比如for(int i; i<8;i++)......;这样的代码我在stm32f4里运行好像没出过问题,而放在K60里程序就会奔溃.....

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 局部变量常常在栈里,栈里的内存不初始化的话,是有可能不是0的。

    比如有一个函数使用过这一块栈空间,然后释放了,这个函数再去用这块栈空间,不初始化的话,还是上一个函数遗留的值

    毕竟出栈操作,仅仅是POP出数据,然后修改SP。

    并没有复原栈内存

    • 发布于 2018-03-09
    • 举报
    • 评论 1
    • 2
    • 0
电子老工程师 回复了 :根据图片实物,确认不了具体型号。 回复

其他答案 数量:17
  • 别找内核的碴,局部变量不赋初值,不是说状况一定当时就能出现,局部变量不赋初值只是在埋雷而已,你幸运的话,就是不出现,不幸运的话就集体爆发。这个问题在程序成规模后极难排查,所以好程序员的最基本习惯,是局部变量赋初值
    • 发布于2018-03-09
    • 举报
    • 评论 1
    • 2
    • 0
电子老工程师 回复了  :封装不一样,OPA564AIDWP:20-HSOIC, OPA564AIDWDR:20-HSOP 回复

  • 不同的编译器处理方式不一样,最简单的方法就是无论是全局变量还是局部变量只要声明了变量就要初始化,养成好的习惯后无论使用什么编译器都不会有问题。
    • 发布于2018-03-10
    • 举报
    • 评论 1
    • 1
    • 0
电子老工程师 回复了  :推荐型号ECQ-E6104JF Panasonic Electronic Components 前台有规格书,需要发给客户确认是否实际设计 回复

  • 全局变量也有初始化和不初始化的,更不用说局部变量了,其实单片机启动程序里默认的初始化把你害了,没有哪儿说RAM是一定初始化的,这只是你的错觉,用C,你的权利极大就不要要求这些C中未定义的东西,我们优化处理速度有时就专门去掉RAM的初始化,想省心的话用java,java语言有规定初始化问题
    • 发布于2018-03-10
    • 举报
    • 评论 1
    • 1
    • 0
电子老工程师 回复了  :原厂没有权限下载 回复

  • 全局变量默认初始化为0,局部变量如果定义的时候不赋值会是一个垃圾值
    • 发布于2018-03-09
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :同系列没有替代型号。 回复

  • 这个可能是编程习惯,以及编译器处理偏好

    可能有的编译器默认给你初始化了而已,但最好是显式自行初始化而不依据编译器特性,这样更安全,也好移植。

    • 发布于2018-03-09
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :10118192-0001LF Amphenol ICC (FCI) 请参考。 回复

  • 你声明的是局部变量默认值是不为o的
    • 发布于2018-03-09
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :国产没有符合替代型号。 回复

电子老工程师 回复了  :型号:AO4423。实物丝印:4443,属于不良,是否是老批次物联,跟国产渠道原厂确认一下。 回复

  • 你这个问题和硬件无关,顶多就是和编译器有点关系,看编译器怎么处理的变量。还有就是变量在位置不同,有的初始化为0,有的不为0。你这个是局部变量,在进程栈空间,都初始化吧,是个好习惯,不出初始化没准哪天就出问题你自己都不知道怎么回事


    • 发布于2018-03-09
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :KA1-MV10205M1(60A) Harwin Inc. 2119370002 (120A) molex 请参考 回复

  • 局部变量不赋值可能等于随机数,能运行说明正好是这个变量是0
    • 发布于2018-03-10
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :AD8475BRMZ-R7 Analog Devices Inc 发客户确认一下是否满足产品功能的实际需求 回复

  • 和编译器有关系,申请变量时,一定要赋初值,养成良好的习惯
    • 发布于2018-03-10
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :经过查找该型号没有合适的替代料 回复

  • 编译器的语法规则扩展不一样,可以上官网找相应的语法支持手册,但在ansi内的语法都是支持的
    • 发布于2018-03-10
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :散装 回复

  • 这个与芯片是没有什么关系的,与变异的有关系,不同的编译器的容错规则是不一样的,想MDK变异就可以不用赋初值。这都是编译器的问题
    • 发布于2018-03-10
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :端子找胶壳需要提交pin数参数。 回复

  • 这就是编译器编译问题,最好养成习惯,申请变量都给变量赋值
    • 发布于2018-03-10
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :中间位置原厂图纸说明非焊接位(非接触端),不会影响产品正常性能。 回复

  • 这与编译器有关的,有的编译器会自动 设置成0,便是有的并不会,而是内存中的一个随即数据。
    • 发布于2018-03-11
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :DAC8550IBDGKT, Texas Instruments,供参考 回复

  • STM32跟K60都用的同一款编译器,应该是程序其他部分出错了
    • 发布于2018-03-12
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :没有国产替代 回复

  • 和编译器有关系,有些编译器局部变量不会赋值为0的。
    • 发布于2018-03-15
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  : 回复

  • 局部变量的变化方式跟编译器、开发环境等都有关系,有些会变化是因为内存中变量的地址内容出现不可预料的更改。

    • 发布于2018-03-31
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :带Y的是车规级的 回复

相关问题

问题达人换一批

变量初始化问题