最近遇到一个问题,在debug模式下怎么运行结果都是正确的,而release时会出现一些诡异的问题,但是问题又诡异的很,比如我printf几句无关痛痒的log信息,可能现象又对了。

只好在汇编模式下一行一行的跟下去,最终发现了问题的所在。

问题是这样的,我有一处代码用到了zlib的解压:

int uncompress(Bytef * dest, uLongf * destLen, const Bytef * source, uLong sourceLen);

因为之前没用过也没有仔细看参数传递规则,不知道deslen一定要传入目标buffer dest的大小,以为他只是一个返回值,于是就这样调用了:

uLongf destLen;

uncompress(dest, destLen, ...);

这里犯了两个错误,一是没有检查uncompress的返回值(这里不怪我,因为我调用的函数是前人在uncompress上封装了一层,然后就没返回值了)。然后呢,诡异的问题就出现了:

VC的debug模式局部变量会默认的赋值为0xcdcdcdcd,这是debug下正确的原因,因为uncompress会认为我的传入dest是足够大的(事实上是刚刚够,因为解压之前我就知道这个buffer的大小),所以就高高兴兴地去解压了,然后目标buffer也足够大不会越界,然后,然后就一切正常了...

而release下VC就不会给局部变量赋值了,然后呢,在调用的时候有时(对,就是有时,没初始化,这个值就是随机的!)就会发现目标buffer dest的大小不够用了,然后就调用失败了,然后我调用的函数没有返回值,然后认为一切正常,然后dest里的值还是初始值,然后就效果不对了,然后就傻逼了...

归根结底呢,是坏习惯的问题,首先,应该检查返回值,这是前人的错,我可以无耻的推卸掉,但是变量没初始化的过错就是万万退不掉了,假使我即使不知道destLen要传实际dest的大小,我把它初始化成0,那么至少会在debug的时候问题就显现出来,不至于在release中无所适从,一个简单的问题用了半天的时间才发现根结所在。

所以结论就是,定义变量时一定要初始化,哪怕看起来很无用很无聊,至少这样会减少很多犯错的几率!

转载于:https://www.cnblogs.com/andyzhshg/archive/2012/10/31/2747896.html

定义变量时一定要初始化相关推荐

  1. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )

    文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...

  2. 定义变量时无引号,单引号,双引号区别与特点:

    a=192 a=192-$a b='192-$a' c="192-$a" echo "a=$a" echo "b=$b" echo &quo ...

  3. java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

    探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...

  4. 结构体定义变量及初始化

    当我们定义了结构体类型之后,可以使用结构体类型来定义变量,定义变量的方式与基本数据类型定义变量一样.假设我们定义了如下的结构体类型: //定义结构体类型 struct reader { //定义结构体 ...

  5. Javascript中函数中定义变量无var

    参考: https://wiki.jikexueyuan.com/project/brief-talk-js/about-var.html 前段时间回答了一个关于定义变量时使用关键字 var 与否的区 ...

  6. linux变量赋值用中括号,Shell脚本定义变量和重新赋值

    Shell支持自定义变量. 定义变量 定义变量时,变量名不加美元符号($),如: 代码如下: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你 ...

  7. python定义变量_Python基础 变量的基本使用

    变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...

  8. python定义变量类型列子_Python系列课程-变量类型

    昨天有人问不懂英语能否学编程,这个问题我在工作中,也经常被业务部门的同事问到.我认为前期入门阶段,是否懂英语对于编程没什么影响,我举个例子,例如给一个变量起名字: pingguo='苹果' apple ...

  9. python定义变量类型为数字_python 学习(四)- 变量类型

    一.变量的定义和使用 为什么需要变量?当然是通过变量来存储数据,而存储的数据类型可能是数字.字符串.字符等等,将这些数据存储在变量中,可以方便我们去使用,除了变量之外还有一个常量,区别就是,常量是不可 ...

最新文章

  1. linux系统宿主定制之初窥门径
  2. python split 倒数第一个_请教一个在python中该如何去掉split之后的第一个单词?
  3. centos7.9更改root账号密码
  4. linux内核make menuconfig执行过程
  5. 推荐一个看ELF文件的软件 010Editor
  6. 【Hoxton.SR1版本】Spring Cloud Sleuth分布式请求链路跟踪
  7. HFSS - WLAN双频单极子天线设计与仿真
  8. 中值滤波器及均值滤波器
  9. matlab igbt 关断,IGBT关断过程分析
  10. 提高 Mac OS X 速度的 52 个方法
  11. Golang环境windows 设置 GOROOT 和 GOPATH
  12. Android 屏幕适配tips
  13. html5 制作游戏
  14. 51心形流水灯原理图PCB及程序简介
  15. 想到我爱你的绝对不正常
  16. python用表格中的数据画柱状图_Python数据可视化:5种绘制柱状图表的方法(附源码)...
  17. Python 条件语句
  18. 网站没有搜索功能怎么搜索_如何搜索任何网站,即使它没有搜索功能
  19. 刚刚,我们和ChatGPT聊了聊边缘计算
  20. Ubuntu16.04下firefox flash过期问题

热门文章

  1. 洛谷 P1034 矩形覆盖
  2. Optional变量初学者指南
  3. Lucene查询索引(分页)
  4. Servlet+Tomcat制作出第一个运行在Tomcat上的Java应用程序
  5. 每天一个linux命令---导出到文件
  6. Linux下 数据文件 效验问题
  7. Java mybatis实现mysql批量插入
  8. 提高Python运行效率的6大技巧!
  9. java的定时器用法
  10. 解决:XCODE 4.2 无法连接SVN,提示:Unable to load revisions