C语言低级错误案例
来源:互联网 发布:如何更改网页授权域名 编辑:程序博客网 时间:2024/05/05 15:58
一,修改函数形参
分析:在函数内部不能改变指针指向的地址,。当TrunkHBDeactive函数调用SetTimeHandle函数获取指针的时候,实际上pTime的值根本没有改变,始终为一个空指针。
注:对函数参数所在的存储单元的直接修改不会作用在函数之外,但是对参数存储单元中存放的地址指向的存储单元的修改,则会在函数之外起作用。
总结:函数内部不能修改指针指向的地址 TimerHandle,但可改变指针指向得知的内容 *TimerHandle:
二,返回局部变量(堆栈)的地址
分析:局部变量的内容存放在堆栈内,其所占用的空间在函数返回后会自动释放,导致函数返回的指针指向了不可预知的内存。故要注意不要返回局部变量堆栈中的地址。
修改方法如下:传入一个已经由上层函数分配好空间的指针,并在函数内部修改指针指向的内容。这样就可以确保函数返回后,pData指针指向的内容仍然是有效的。
三,强制类型转换和字节序
问题一:
问题二:
分析:大端序存储顺序:高地址存储低位字节,低地址存储高位字节;小端序存储顺序:低地址存储低位字节,高地址存储高位字节。函数对4字节序的修改只会修改2个字节,在大端序cpu中修改高位字节导致错误。
强制转换灵活性/安全性总结:
1,当目的结构的空间大于源结构的空间时,考虑越界问题。
2,当目的结构的空间小于源结构的空间时,考虑字节序(大小端)问题。
3,在把某些变量或数组或结构强制转换为另一种结构体时,需要考虑字节对齐问题。
4,基本数据类型(char,int,short,long)的强制类型转换比结构体之间的强制类型转换更容易出现上诉情况。
5,不要将字符串常量强制转换为字符指针(const char * —-> char *),以免导致改写只读数据的段错误。
四,变量溢出
问题一:
分析:ucCount不可能大于)xFF,导致死循环。故要注意,使用循环变量不能使用UC类型(unsigned char),最好使用US(unsigned short)或UL(unsigned long),避免循环边界值大于255导致死循环。
问题二:
当ulTimeOutInMillSec非常大时,乘以100有可能导致溢出,乘法的结果会变成一个很小的值。
- C语言低级错误案例
- C语言必须杜绝的低级错误
- c语言中应该绝对避免一些的低级错误
- C语言的低级运算
- Unix下C语言----低级文件编程
- c 语言宏定义低级bug
- 低级错误
- 低级错误
- 低级错误!
- 低级错误
- 低级错误
- 低级错误
- 低级错误
- 经典c语言案例
- c语言案例
- c语言经典案例
- c语言经典案例
- C语言案例
- (编程题)5-20 打印九九口诀表
- 解析 Android 事件传递机制
- # Unity 自学与进阶必会目录
- Eclipse中将Java项目打包为jar,并且引入第三方jar包解决办法
- Java豆瓣电影爬虫——减少与数据库交互实现批量插入
- C语言低级错误案例
- javaweb项目启动定时任务的实现
- 编译安装Ambari
- C#集成第三方控件devexpress 15.2安装说明
- java设计模式-访问者模式visit
- # 开发 VR 多人游戏的技术挑战
- RMAN创建恢复目录数据库
- 326. Power of Three解法
- 使用PwDump和ophcrack获取系统密码