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

C语言对数组A赋值时未修改的B数组出现异常值问题

问题现象

声明两个初始元素完全相同的数组A、B,初始值均为{ 1, 2, 3, 4 }。代码逻辑中仅对数组A执行A[B[i]] = A[i] + 1赋值操作,从未对B做写入,但执行完成后B出现了非预期的异常数值。

复现代码

#include <stdio.h>

void arrayPrint(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int A[4] = { 1, 2, 3, 4 };
    int B[4] = { 1, 2, 3, 4 };

    int n = 3;

    printf("Before \n");

    printf("Array A \n");
    arrayPrint(A, 4);

    printf("Array B \n");
    arrayPrint(B, 4);

    for (int i = 0; i <= n; i++) {
        if (A[i] == B[i]) {
            A[B[i]] = A[i] + 1;
        }
    }

    printf("\nAfter \n");

    printf("Array A \n");
    arrayPrint(A, 4);

    printf("Array B \n");
    arrayPrint(B, 4);

    return 0;
}

实际运行输出

Before
Array A
1 2 3 4
Array B
1 2 3 4

After
Array A
1 2 3 4
Array B
5 2 3 4

预期输出

Before
Array A
1 2 3 4
Array B
1 2 3 4

After
Array A
1 2 3 4
Array B
1 2 3 4
故障原因

核心问题是数组下标越界写入:

  • C语言中长度为4的数组,合法下标范围是0~3,访问A[4]已经超出了数组A的内存边界,属于未定义行为。
  • 逐轮执行循环可以定位到问题触发点:
    • i=0:B[i]=1,写入A[1],下标合法,写入值和原值一致无变化
    • i=1:B[i]=2,写入A[2],下标合法,写入值和原值一致无变化
    • i=2:B[i]=3,写入A[3],下标合法,写入值和原值一致无变化
    • i=3:B[i]=4,此时执行A[4] = A[3]+1 =5,A[4]不属于数组A的合法内存范围。在当前编译环境下,栈上数组A的后方紧邻的内存刚好是数组B的首元素B[0]的存储位置,越界写入的5直接覆盖了B[0]的原值,最终就出现了B数组首元素异常、A数组合法范围内元素完全没变的现象。
修复方案
  • 所有数组下标访问前增加合法性校验,确保下标满足0 <= 下标 < 数组长度,从逻辑上杜绝越界。
  • 如果业务逻辑确实需要使用下标4访问元素,声明数组时需要将数组长度设置为至少5,为下标4预留合法的存储空间。

内容的提问来源于stack exchange,提问作者altair00

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:24:16