打印
[其他]

指针加减运算的bug避坑

[复制链接]
946|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

**指针的加减运算是特殊的。**下面的代码运行在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 | 只看该作者
一般来说,指针加减运算的步长取决于指针的类型。如果忽略类型,可能导致地址计算错误。

使用特权

评论回复
5
tax2r6c| | 2025-3-19 17:22 | 只看该作者
其实指针和整数直接相加可能导致地址计算错误

使用特权

评论回复
6
su1yirg| | 2025-3-19 18:36 | 只看该作者
有个这个问题,比如说指针减法的结果是两个指针之间的元素个数,而不是字节数。

使用特权

评论回复
7
suw12q| | 2025-3-19 21:08 | 只看该作者
对空指针或野指针进行加减运算会导致未定义行为

使用特权

评论回复
8
y1n9an| | 2025-3-20 09:06 | 只看该作者
多级指针(如 int**)的加减运算容易混淆。

使用特权

评论回复
9
zhizia4f| | 2025-3-20 11:20 | 只看该作者
结构体指针的加减运算可能引发对齐问题。

使用特权

评论回复
10
g0d5xs| | 2025-3-20 13:07 | 只看该作者
动态分配的内存可能在使用指针运算时越界。

使用特权

评论回复
11
liu96jp| | 2025-3-20 15:18 | 只看该作者
函数参数中的指针运算可能导致误解。

使用特权

评论回复
12
wang6623| | 2025-3-31 13:43 | 只看该作者
在32位ARM架构上,指针加减运算时的行为与数据类型的大小密切相关。

使用特权

评论回复
13
chenci2013| | 2025-4-5 19:52 | 只看该作者
指针加减整数时,偏移量是 n * sizeof(类型) 字节。

使用特权

评论回复
14
mickit| | 2025-4-5 20:38 | 只看该作者
在使用指针之前,应该始终检查它是否为NULL。这可以通过if语句或断言来实现。

使用特权

评论回复
15
chenjun89| | 2025-4-5 21:56 | 只看该作者
指针加一是按照位数来算的。

使用特权

评论回复
16
mmbs| | 2025-4-5 22:10 | 只看该作者
数组名退化为指针,但指针运算可能破坏数组语义

使用特权

评论回复
17
timfordlare| | 2025-4-6 07:07 | 只看该作者
在释放内存后,将指针设置为NULL,以避免野指针的产生。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

282

主题

2183

帖子

6

粉丝