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

使用指针传递二维数组作为参数时,打印结果全为零的问题排查

问题根源与修复方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:20:15