You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:10:42