C中的负数组索引

时间:2011-11-15 09:03:04

标签: c arrays pointers

论坛中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)

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

3 个答案:

答案 0 :(得分:14)

由于您正在访问数组越界,因此在编写时会出现未定义的行为。

然而,负面指数并不一定意味着未定义的行为。以下代码定义明确:

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);

答案 1 :(得分:5)

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

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

  

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


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

此外,该标准确定了导致未定义行为的所有以下场景:

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

答案 2 :(得分:1)

访问数组外的元素是Undefined Behaviour

此外,使指针指向数组之外的元素,除了(不存在的)一个过去的最后一个元素,也是未定义的行为。访问最后一个是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 */