定义变量时一定要初始化
最近遇到一个问题,在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
定义变量时一定要初始化相关推荐
- 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )
文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...
- 定义变量时无引号,单引号,双引号区别与特点:
a=192 a=192-$a b='192-$a' c="192-$a" echo "a=$a" echo "b=$b" echo &quo ...
- java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...
探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...
- 结构体定义变量及初始化
当我们定义了结构体类型之后,可以使用结构体类型来定义变量,定义变量的方式与基本数据类型定义变量一样.假设我们定义了如下的结构体类型: //定义结构体类型 struct reader { //定义结构体 ...
- Javascript中函数中定义变量无var
参考: https://wiki.jikexueyuan.com/project/brief-talk-js/about-var.html 前段时间回答了一个关于定义变量时使用关键字 var 与否的区 ...
- linux变量赋值用中括号,Shell脚本定义变量和重新赋值
Shell支持自定义变量. 定义变量 定义变量时,变量名不加美元符号($),如: 代码如下: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你 ...
- python定义变量_Python基础 变量的基本使用
变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...
- python定义变量类型列子_Python系列课程-变量类型
昨天有人问不懂英语能否学编程,这个问题我在工作中,也经常被业务部门的同事问到.我认为前期入门阶段,是否懂英语对于编程没什么影响,我举个例子,例如给一个变量起名字: pingguo='苹果' apple ...
- python定义变量类型为数字_python 学习(四)- 变量类型
一.变量的定义和使用 为什么需要变量?当然是通过变量来存储数据,而存储的数据类型可能是数字.字符串.字符等等,将这些数据存储在变量中,可以方便我们去使用,除了变量之外还有一个常量,区别就是,常量是不可 ...
最新文章
- linux系统宿主定制之初窥门径
- python split 倒数第一个_请教一个在python中该如何去掉split之后的第一个单词?
- centos7.9更改root账号密码
- linux内核make menuconfig执行过程
- 推荐一个看ELF文件的软件 010Editor
- 【Hoxton.SR1版本】Spring Cloud Sleuth分布式请求链路跟踪
- HFSS - WLAN双频单极子天线设计与仿真
- 中值滤波器及均值滤波器
- matlab igbt 关断,IGBT关断过程分析
- 提高 Mac OS X 速度的 52 个方法
- Golang环境windows 设置 GOROOT 和 GOPATH
- Android 屏幕适配tips
- html5 制作游戏
- 51心形流水灯原理图PCB及程序简介
- 想到我爱你的绝对不正常
- python用表格中的数据画柱状图_Python数据可视化:5种绘制柱状图表的方法(附源码)...
- Python 条件语句
- 网站没有搜索功能怎么搜索_如何搜索任何网站,即使它没有搜索功能
- 刚刚,我们和ChatGPT聊了聊边缘计算
- Ubuntu16.04下firefox flash过期问题