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有可能导致溢出,乘法的结果会变成一个很小的值。

0 0
原创粉丝点击