C中的负数组索引

在论坛中C中的负数组上还有其他问题/答案,但我会为32位编译器请求这些答案:如果我们有一个数组定义int test_array[5] = {1,2,3,4,5};

接下来的语句应该返回test_array[20]test_array[-2]test_array[-32764]test_array[4294967700] (大于32位可以容纳的值), *(a-32764)

如果索引超出其声明的范围,编译器是否会强制返回任何固定值?

访问超出其边界的数组会导致未定义的行为(UB)
-ve索引不是有效索引,会导致未定义行为。

一个未定义的Bheavior意味着任何事情都可以按字面意思发生,如果你很幸运,你的程序会崩溃并且问题被检测到,如果你运气不好,代码一直很好,并且有一天所有的地狱都会崩溃。
因此,始终避免编写任何导致未定义行为的代码。

如果索引超出其声明的范围,编译器是否会强制返回任何固定值?

没有
程序员必须处理这个问题。 标准不需要编译器为此提供任何指示/警告。标准只是将其定义为UB

此外,该标准还标识了导致未定义行为的所有以下方案:

  • 将指针加到或减去数组对象和整数类型会产生一个不指向或超出同一数组对象的结果。
  • 将指针加到或减去数组对象和整数类型会产生一个指向数组对象之外的结果,并用作被计算的一unary * operator的操作数。
  • 数组下标超出范围,即使一个对象显然可以使用给定的下标访问(如左边的表达式a[1][7]给出声明int a[4][5] )。

在您编写它时,它是未定义的行为,因为您正在访问数组越界。

但是,负指数并不一定意味着未定义的行为。 以下代码定义良好:

 int test_array[5] = {1,2,3,4,5}; int *p = test_array + 1; int i = p[-1];//i now has the value 1 

这相当于:

 int i = *(p-1); 

访问数组外部的元素是Undefined Behavior 。

此外,使指针指向数组之外的元素,除了(不存在的)一个过去的最后一个元素,也是未定义的行为。 访问最后一个是未定义的行为(指针存在是否正常)

 int arr[42] = {0}; int *ptr = arr; ptr += 41; /* ok, ptr points to the last element of arr */ *ptr; /* ok */ ptr += 1; /* ok, ptr points to one-past-the-last */ *ptr; /* UB */ ptr += 1; /* UB */ ptr = arr; ptr -= 1; /* UB */