You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写龟兔赛跑模拟程序时,数组越界指针比较的合法性确认

关于数组指针越界比较的合法性问题

首先明确: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:45:36