使用指针传递二维数组作为参数时,打印结果全为零的问题排查
问题根源与修复方案
1. 函数调用参数完全错误
你在main里调用calcula_media(matriz[3])犯了两个关键问题:
matriz是float[3][3]类型的二维数组,作为函数参数时会自动转为指向第一个一维数组的指针(float (*)[3]),这和你的函数参数类型完全匹配,直接传matriz就对了。matriz[3]是访问数组的第4个元素(数组下标从0开始,合法范围是0-2),属于越界访问,它的类型是float*,和函数要求的float (*)[3]类型不兼容。这导致你的函数操作的是数组之外的无效内存,根本碰不到原数组,自然不会修改它的值。
修复:
把调用语句改成:
calcula_media(matriz);
2. 函数内的打印语句错打了指针地址
calcula_media里的printf("%.1f ", (*(matriz+i)+j));是在打印指针的地址值,而不是数组元素的实际值。当把指针地址强制转换为float类型输出时,通常会显示为0.0,这就是你看到打印全零的原因。
修复:
需要解引用指针拿到元素值,修改成:
printf("%.1f ", *(*(matriz+i)+j));
3. 非标准的void main(建议修复)
C标准规定main函数的返回类型必须是int,void main是部分编译器的非标准写法,建议改成:
int main() { // 原有代码 return 0; }
修复后的完整代码
#include <stdio.h> // 原代码缺少这个头文件,必须添加才能使用printf void calcula_media(float (*matriz)[3]){ int i, j; for(i=0;i<3;i++){ for(j=0;j<3;j++){ *(*(matriz+i)+j)=i+j; printf("%.1f ", *(*(matriz+i)+j)); } printf("\n"); // 加换行让输出更清晰 } } int main(){ float matriz[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9}; int i, j; calcula_media(matriz); printf("\n修改后的数组内容:\n"); for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("%.1f ", *(*(matriz+i)+j)); } printf("\n"); } return 0; }
运行效果
修复后,calcula_media会正确修改原数组的元素为i+j,函数内的打印会输出修改后的值,main里的打印也会显示更新后的数组内容,不再是初始的1-9。
内容的提问来源于stack exchange,提问作者Isabel Longo
相关产品推荐
相关产品推荐

