为什么越界指针算术未定义行为?
越界指针算术,如代码片段所示下面,被认为是 C 中的未定义行为。
int arr[4] = {0, 1, 2, 3}; int* p = arr + 5; // Undefined behavior
与指针应表现得像整数的预期相反,它们具有独特的特征。问题的症结在于 C 标准本身,明确地将越界指针操作归类为未定义行为。
虽然在大多数平台上,超出数组边界的指针算术不会导致只要指针保持未解除引用状态,就会发生崩溃或异常行为,如果不打算使用这种算术,那么人们必须质疑这种算术的目的。
但是,C 11 规范明确承认表达式超出数组末尾的精确度一个在技术上是“正确的”并且不会导致崩溃。然而,它的结果是未定义的,而表达式超过数组边界是严格未定义的行为。
需要强调的是,尽管允许访问超出数组末尾的一个位置,但这并不意味着安全。在此扩展范围内读取或写入数据可能会操作数组边界之外的数据,从而导致内存损坏和状态不一致。
这种对越界指针算术的严格立场背后的基本原理是潜在的复杂性指针运算可能导致危险情况的场景。因此,为了避免不一致并保持一致性,完全禁止此类行为被认为更简单。
以上是为什么 C 中的越界指针运算被视为未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!