AdaMaYun 发表于 2024-7-30 13:00

指针加减运算的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字节数据的内容,在大多数架构处理器中都会是随机数。

lamanius 发表于 2025-3-19 14:36

指针加减运算可能导致访问超出分配内存的范围,引发未定义行为(如段错误、数据损坏等)。

q1ngt12 发表于 2025-3-19 14:38

数组名在表达式中会退化为指针,可能导致误解

l1uyn9b 发表于 2025-3-19 16:12

一般来说,指针加减运算的步长取决于指针的类型。如果忽略类型,可能导致地址计算错误。

tax2r6c 发表于 2025-3-19 17:22

其实指针和整数直接相加可能导致地址计算错误

su1yirg 发表于 2025-3-19 18:36

有个这个问题,比如说指针减法的结果是两个指针之间的元素个数,而不是字节数。

suw12q 发表于 2025-3-19 21:08

对空指针或野指针进行加减运算会导致未定义行为

y1n9an 发表于 2025-3-20 09:06

多级指针(如 int**)的加减运算容易混淆。

zhizia4f 发表于 2025-3-20 11:20

结构体指针的加减运算可能引发对齐问题。

g0d5xs 发表于 2025-3-20 13:07

动态分配的内存可能在使用指针运算时越界。

liu96jp 发表于 2025-3-20 15:18

函数参数中的指针运算可能导致误解。

wang6623 发表于 2025-3-31 13:43

在32位ARM架构上,指针加减运算时的行为与数据类型的大小密切相关。
页: [1]
查看完整版本: 指针加减运算的bug避坑