二维数组静态分配:函数传参填值异常问题求助
问题分析与解决方案:二维数组指针传参后的赋值错误
你的代码核心问题并非传引用调用失败(从各个函数打印的%p地址能看到,所有函数里的M地址和主函数完全一致,传参是正确的),而是**scanf的格式符与参数传递错误**,导致写入了错误的内存区域。
具体错误点
- 格式符不匹配:
数组是double类型,但scanf用了%f格式符——%f对应float类型,读取double必须用%lf格式符。 - 参数传递错误:
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
相关产品推荐
相关产品推荐

