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

二维数组列平均值计算异常:填充随机数后结果全为0

你的C语言代码问题分析与修正

代码存在的核心问题

  • 数组初始化顺序错误:你在m、n为0时就定义了变长数组array[m][n]和avg_col,之后输入的m、n不会改变数组的实际大小,导致数组尺寸完全不符合预期,甚至触发越界访问的未定义行为。必须先获取用户输入的m、n,再定义对应大小的数组。

  • 随机数生成逻辑完全错误:

    • ran_num只在程序启动时生成一次,所有数组元素都会被赋值为同一个值;
    • (double)rand() / RAND_MAX生成的是0到1之间的浮点数,赋值给int类型的数组元素时会被直接截断为0,这直接导致所有数组元素都是0,平均值自然为0;
    • 未初始化随机数种子,rand()每次运行都会生成完全相同的序列,需要用srand(time(NULL))初始化(需引入<time.h>头文件)。
  • 循环边界越界:循环条件i <= m和j <= n会让下标超出数组有效范围(数组下标从0开始,有效范围是0~m-1、0~n-1),属于未定义行为,应改为i < m和j < n。

  • 平均值数组越界:double avg_col[] = {0};只初始化了1个元素,当n>1时,访问avg_col[j](j≥1)会触发越界,必须在知道n的大小后定义double avg_col[n] = {0};。

  • 整数除法导致精度丢失:array[i][j] / m是整数除法,即使数组元素是正确数值,也会截断小数部分,应转换为浮点数计算:(double)array[i][j] / m。


修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>  // 用于初始化随机数种子

int main(void) {
    
    int m = 0;
    int n = 0;
    
    printf("Enter (m, n > 0): ");
    scanf("%d, %d", &m, &n);
    
    // 先获取m、n,再定义对应大小的数组
    int array[m][n];
    double avg_col[n] = {0};  // 初始化n个元素的平均值数组
    
    // 初始化随机数种子,确保每次运行生成不同的随机序列
    srand(time(NULL));
    
    for(size_t i = 0; i < m; ++i){
        for(size_t j = 0; j < n; ++j){
            // 生成0到99之间的随机整数(可根据需求调整范围)
            array[i][j] = rand() % 100;
            // 转换为浮点数计算,避免整数除法精度丢失
            avg_col[j] += (double)array[i][j] / m;
        }
    }
    
    for(int i = 0; i < n; i++){
        printf("Average of column %d : %.3f\n", i ,avg_col[i]);
    }
    
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:05:33