C中的负数组索引

Ble*_*mer 3 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)等

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

Dav*_*nan 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
Run Code Online (Sandbox Code Playgroud)

这相当于:

int i = *(p-1);
Run Code Online (Sandbox Code Playgroud)


Alo*_*ave 5

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

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

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

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

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

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