这里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
您正在访问数组边界之外的内存; 在C中,没有对数组索引进行边界检查.
在技术上访问超出数组末尾的内存会导致未定义的行为.这意味着无法保证您执行此操作时会发生什么.在您的示例中,您最终会覆盖另一个变量占用的内存.但是,未定义的行为也可能导致应用程序崩溃或更糟.
有没有办法来捕捉这些错误?
编译器可以捕获这样的错误,但不是很多.在编译时通常无法捕获此类错误并报告警告.
静态分析工具可以捕获此类错误的其他实例,通常用于报告有关可能导致此类错误的代码的警告.