C语言中访问不存在的数组元素为何未触发错误?
C语言数组越界无报错的原因及代码修正
数组越界为何不触发错误?
这段代码里arr1是长度为5的数组,有效下标范围是0-4,但循环中i会从0遍历到99,当i>=5时就会访问arr1[i]这个不存在的元素,却既无编译错误也无运行报错,原因如下:
#include <stdio.h> #include "functions.h" int main() { unsigned char arr1[5] = {1, 2, 3, 4, 5}; int N=100; int arr2[N]; int i; for(i=0;i<N;++i) { arr2[i] = i; //Some function defined in a file functions.c func1(arr2[i],arr1[i]); } return 1; }
- C语言设计的核心是信任程序员,默认不做数组边界检查——额外的检查会增加运行时开销,把内存安全的责任交给开发者。
- 编译阶段:编译器无法提前预判循环变量
i的动态取值,因此不会对这种非常量的下标越界抛出编译错误(只有像arr1[10]这种编译期就能确定的越界,才可能被部分编译器给出警告)。 - 运行阶段:数组存储在栈内存中,越界访问的是栈上相邻的内存区域。如果这块区域暂时没有被其他关键数据占用,程序不会立刻崩溃或报错,但这属于未定义行为——后续可能出现数据篡改、程序莫名崩溃、逻辑诡异出错等问题,只是当下没表现出来。
嵌套循环代码的修正注意点
你提到原本应该用嵌套循环,给出的代码存在一处致命错误:
#include <stdio.h> #include "functions.h" int main() { unsigned char arr1[5] = {1, 2, 3, 4, 5}; int N=100; int arr2[N]; int i; int j; for(j=0;j<5;++i) { for(i=0;i<N;++i) { arr2[i] = i; //Some function defined in a file functions.c func1(arr2[i],arr1[j]); } } return 1; }
外层循环的增量部分写的是++i,但循环控制变量是j,这会导致j永远无法达到终止条件j<5,程序直接陷入死循环。正确的写法是把外层循环的增量改为++j:
for(j=0;j<5;++j) { for(i=0;i<N;++i) { arr2[i] = i; func1(arr2[i],arr1[j]); } }
内容的提问来源于stack exchange,提问作者Brassard1984
相关产品推荐
相关产品推荐

