指针加减运算的bug避坑
**指针的加减运算是特殊的。**下面的代码运行在32位ARM架构上,执行之后,a和p的值分别是多少?
int a=1;
int *p=(int *)0x00001000;
a=a+1;
p=p+1;
对于a的值很容判断出结果为2,但是p的结果却是0x00001004。指针p加1后,p的值增加了4,这是为什么呢?原因是指针做加减运算时是以指针的数据类型为单位。p+1实际上是按照公式p+1*sizeof(int)来计算的。不理解这一点,在使用指针直接操作数据时极易犯错。
某项目使用下面代码对连续RAM初始化零操作,但运行发现有些RAM并没有被真正清零。
通过分析我们发现,由于pRAMaddr是一个无符号int型指针变量,所以pRAMaddr+=4代码其实使pRAMaddr偏移了4*sizeof(int)=16个字节,所以每执行一次for循环,会使变量pRAMaddr偏移16个字节空间,但只有4字节空间被初始化为零。其它的12字节数据的内容,在大多数架构处理器中都会是随机数。
指针加减运算可能导致访问超出分配内存的范围,引发未定义行为(如段错误、数据损坏等)。 数组名在表达式中会退化为指针,可能导致误解 一般来说,指针加减运算的步长取决于指针的类型。如果忽略类型,可能导致地址计算错误。 其实指针和整数直接相加可能导致地址计算错误 有个这个问题,比如说指针减法的结果是两个指针之间的元素个数,而不是字节数。 对空指针或野指针进行加减运算会导致未定义行为 多级指针(如 int**)的加减运算容易混淆。 结构体指针的加减运算可能引发对齐问题。 动态分配的内存可能在使用指针运算时越界。 函数参数中的指针运算可能导致误解。 在32位ARM架构上,指针加减运算时的行为与数据类型的大小密切相关。
页:
[1]