[其他] 指针加减运算的bug避坑

[复制链接]
 楼主| AdaMaYun 发表于 2024-7-30 13:00 | 显示全部楼层 |阅读模式

**指针的加减运算是特殊的。**下面的代码运行在32位ARM架构上,执行之后,a和p的值分别是多少?

  1. int a=1;
  2. int *p=(int *)0x00001000;
  3. a=a+1;
  4. p=p+1;


对于a的值很容判断出结果为2,但是p的结果却是0x00001004。指针p加1后,p的值增加了4,这是为什么呢?原因是指针做加减运算时是以指针的数据类型为单位。p+1实际上是按照公式p+1*sizeof(int)来计算的。不理解这一点,在使用指针直接操作数据时极易犯错。

某项目使用下面代码对连续RAM初始化零操作,但运行发现有些RAM并没有被真正清零。

1.png

通过分析我们发现,由于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架构上,指针加减运算时的行为与数据类型的大小密切相关。
chenci2013 发表于 2025-4-5 19:52 | 显示全部楼层
指针加减整数时,偏移量是 n * sizeof(类型) 字节。
mickit 发表于 2025-4-5 20:38 | 显示全部楼层
在使用指针之前,应该始终检查它是否为NULL。这可以通过if语句或断言来实现。
chenjun89 发表于 2025-4-5 21:56 来自手机 | 显示全部楼层
指针加一是按照位数来算的。
mmbs 发表于 2025-4-5 22:10 | 显示全部楼层
数组名退化为指针,但指针运算可能破坏数组语义
timfordlare 发表于 2025-4-6 07:07 | 显示全部楼层
在释放内存后,将指针设置为NULL,以避免野指针的产生。
uiint 发表于 2025-4-8 12:14 | 显示全部楼层
指针减法的结果是两个指针之间相隔的元素数量,而不是字节。
robincotton 发表于 2025-4-8 15:28 | 显示全部楼层
指针运算超出数组范围,导致未定义行为。
dspmana 发表于 2025-4-9 20:40 | 显示全部楼层
指针加减运算的结果取决于指针所指向的数据类型。如果不理解这一点,可能会导致错误的计算结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

299

主题

2492

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部