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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:20:34