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数组合法范围内元素完全没变的现象。
- i=0:
修复方案
- 所有数组下标访问前增加合法性校验,确保下标满足
0 <= 下标 < 数组长度,从逻辑上杜绝越界。 - 如果业务逻辑确实需要使用下标4访问元素,声明数组时需要将数组长度设置为至少5,为下标4预留合法的存储空间。
内容的提问来源于stack exchange,提问作者altair00
相关产品推荐
相关产品推荐

