C语言二维数组统计出现垃圾值问题求助(3x3矩阵异常)
问题:二维数组统计时出现未初始化值异常
我编写了一个程序,用于检查二维数组中的元素是否小于等于矩阵大小,并统计满足team[i] < matrix_size的元素类型数量。但出现异常:当矩阵为3x3时,仅team[3]会出现垃圾值;而矩阵为4x4时无此问题。
代码
#include <stdio.h> int main(void){ int matrix_size; int team[105]; int shirt_num = 0; scanf("%d", &matrix_size); for (int i=shirt_num ; i<matrix_size ; i++){ team[i] = 0; } for (int i=0 ; i<matrix_size ; i++){ for (int j=0 ; j<matrix_size ; j++){ scanf("%d", &shirt_num); if (shirt_num <= matrix_size){ team[shirt_num] += 1; printf("team[%d]: %d\n", shirt_num, team[shirt_num]); } } } int less_than_matrix_size = 0; for (int i=1 ; i<=matrix_size; i++){ if (team[i] < matrix_size){ less_than_matrix_size++; } } printf("%d\n", less_than_matrix_size); }
运行错误输出
stephenhau@Stephens-MacBook-Pro socs1_problems % cd "/Users/stephenhau/Documents/Learning/Programming_Language/learn_C/socs1_problems/" && gcc Lab7_B_Attendance.c -o Lab7_B_Attendance && "/Users/stephenhau/Documents/Learning/Programming_Language/learn_C/socs1_problems/"Lab7_B_Attendance 3 0 0 0 team[0]: 1 team[0]: 2 team[0]: 3 0 0 0 team[0]: 4 team[0]: 5 team[0]: 6 1 2 3 team[1]: 1 team[2]: 1 team[3]: 71687169 2 stephenhau@Stephens-MacBook-Pro socs1_problems % cd "/Users/stephenhau/Documents/Learning/Programming_Language/learn_C/socs1_problems/" && gcc Lab7_B_Attendance.c -o Lab7_B_Attendance && "/Users/stephenhau/Documents/Learning/Programming_Language/learn_C/socs1_problems/"Lab7_B_Attendance 4 0 0 0 0 team[0]: 1 team[0]: 2 team[0]: 3 team[0]: 4 0 0 0 0 team[0]: 5 team[0]: 6 team[0]: 7 team[0]: 8 0 0 0 0 team[0]: 9 team[0]: 10 team[0]: 11 team[0]: 12 1 2 3 4 team[1]: 1 team[2]: 1 team[3]: 1 team[4]: 2 4
问题分析
问题根源在数组初始化范围不足:
- 原代码中初始化循环是
for (int i=shirt_num ; i<matrix_size ; i++),仅初始化了team[0]到team[matrix_size-1]。 - 但程序逻辑允许
shirt_num等于matrix_size(判断条件shirt_num <= matrix_size),此时team[matrix_size]未被初始化,保留内存中的垃圾值,第一次累加时就会把垃圾值加1,出现异常数字。 - 4x4矩阵时看似正常是巧合:内存中
team[4]的初始值恰好为1,累加后显示为2,并非真正初始化到位。
解决方法
有两种简单的修复方式:
方式1:初始化整个数组为0
直接在数组声明时初始化,确保所有索引都被置0:
#include <stdio.h> int main(void){ int matrix_size; int team[105] = {0}; // 初始化整个数组为0 int shirt_num = 0; scanf("%d", &matrix_size); // 移除原来的局部初始化循环 for (int i=0 ; i<matrix_size ; i++){ for (int j=0 ; j<matrix_size ; j++){ scanf("%d", &shirt_num); if (shirt_num <= matrix_size){ team[shirt_num] += 1; printf("team[%d]: %d\n", shirt_num, team[shirt_num]); } } } int less_than_matrix_size = 0; for (int i=1 ; i<=matrix_size; i++){ if (team[i] < matrix_size){ less_than_matrix_size++; } } printf("%d\n", less_than_matrix_size); }
方式2:扩大初始化范围
修改初始化循环,覆盖到team[matrix_size]:
// 替换原来的初始化循环 for (int i=0 ; i<=matrix_size ; i++){ team[i] = 0; }
这样就能确保所有会被访问到的team数组索引都被初始化为0,避免垃圾值干扰。
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

