为什么我能够使用数组索引访问其他变量?

Inc*_*ion 1 c

这里LEN为A [10]和是在A [11].有没有办法捕捉这些错误?我尝试使用gcc -Wall -W进行编译,但没有显示任何警告.

int main()
{
  int A[10];
  int i, len;
  len = sizeof(A) / sizeof(0[A]);
  printf("Len = %d\n",len);
  for(i = 0; i < len; ++i){
    A[i] = i*19%7;
  }
  A[i] = 5;
  A[i + 1] = 6;
  printf("Len = %d i = %d\n",len,i);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出: Len = 10 Len = 5 i = 6

Jam*_*lis 7

您正在访问数组边界之外的内存; 在C中,没有对数组索引进行边界检查.

在技​​术上访问超出数组末尾的内存会导致未定义的行为.这意味着无法保证您执行此操作时会发生什么.在您的示例中,您最终会覆盖另一个变量占用的内存.但是,未定义的行为也可能导致应用程序崩溃或更糟.

有没有办法来捕捉这些错误?

编译器可以捕获这样的错误,但不是很多.在编译时通常无法捕获此类错误并报告警告.

静态分析工具可以捕获此类错误的其他实例,通常用于报告有关可能导致此类错误的代码的警告.