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

二维数组静态分配:函数传参填值异常问题求助

问题分析与解决方案:二维数组指针传参后的赋值错误

你的代码核心问题并非传引用调用失败(从各个函数打印的%p地址能看到,所有函数里的M地址和主函数完全一致,传参是正确的),而是**scanf的格式符与参数传递错误**,导致写入了错误的内存区域。

具体错误点

  1. 格式符不匹配:
    数组是double类型,但scanf用了%f格式符——%f对应float类型,读取double必须用%lf格式符。
  2. 参数传递错误:
    scanf需要接收变量的地址,你写的*(*(M+i)+j)是对数组元素的解引用(取元素的值),相当于把一个double值当成内存地址传入,这会导致写入完全随机的内存区域。正确写法是直接传递元素的地址,比如*(M+i)+j或者&M[i][j]。

修正后的entmat函数

void entmat(int a ,int b, double (*M)[b])
{
    int i ,j;
    printf("entmat: %p\n",M);
    for (i=0 ;i<a ;i++)
    {
         for (j=0 ;j<b;j++)
         {
            printf("enter a value for column %d of the row %d ",j+1,i+1);
            // 修正格式符为%lf,传递元素地址
            scanf ("%lf", *(M+i)+j);
            printf("The value of the column %d of the row %d is %lf \n",j+1,i+1,*(*(M+i)+j));
         }
    }
}

额外优化建议

  • sumavr函数中,每行的求和变量s需要在每行循环前初始化,否则会累加所有行的总和:
    void sumavr(int a ,int b, double (*M)[b])
    {
         int i ,j;
         printf("sumavr: %p\n",M);
         double avg ,s;
        for (i=0 ;i<a ;i++)
        {
             s = 0; // 每行重置求和变量
             for (j=0 ;j<b;j++)
             {
                s=s+M[i][j];
             }
        avg = s/b; // 除以列数b,语义更清晰
         printf("the sum of the row %d is %lf and the average is %lf \n",i+1,s,avg);
        }
    }
    
  • 注意拼写错误:raw应为row(行)。

修正后,主函数中的数组就能被正确填充、打印和计算了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:10:24