编写龟兔赛跑模拟程序时,数组越界指针比较的合法性确认
关于数组指针越界比较的合法性问题
首先明确:C标准中,只有指向同一数组元素的指针,或者指向数组末尾之后一个位置的指针,相互之间的比较才是合法且有定义的。
对于你给出的代码:
char arr[70]; char *p1 = &arr[0]; char *p2 = &arr[69];
关于p1 > p1 - 3
p1 - 3指向数组首元素之前3个位置的内存,属于数组范围外的非法指针。虽然在大多数连续内存布局的系统中,这个比较会返回true,但从C标准的角度来说,这种比较是未定义行为——编译器可自由处理,在某些特殊架构(比如非连续内存布局的嵌入式系统)上可能得到不符合预期的结果。
关于p2 < p2 + 6
p2 + 6指向数组最后一个元素之后6个位置的内存,同样是数组范围外的非法指针。常规测试中结果虽为true,但这依然是未定义行为,不能依赖该结果。
合规的边界检测方案
要检测指针是否超出数组范围,正确的做法是将指针与数组的合法边界指针比较:
- 检测越界到数组开头之前:判断指针是否小于
&arr[0] - 检测越界到数组末尾之后:判断指针是否大于等于
&arr[70](&arr[70]是指向数组末尾之后一个位置的指针,属于合法指针,可用于比较)
示例代码:
// 假设当前指针为ptr,关联arr数组 if (ptr < &arr[0]) { // 处理越界到数组开头之前的逻辑 } if (ptr >= &arr[70]) { // 处理越界到数组末尾之后的逻辑 }
这种比较完全符合C标准,结果确定且具备可移植性。
内容的提问来源于stack exchange,提问作者Talete
相关产品推荐
相关产品推荐

