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

C语言如何向打印函数传递矩阵?4x5矩阵打印出现随机值问题

问题原因
  • 第一个错误:scanFloats函数参数类型不匹配,多余的malloc操作导致输入数据根本没有写入目标矩阵
    你在main中定义的float matrix[4][5]是栈上连续分配的二维数组,matrix[i]的类型是float*(指向每行首元素的指针),但scanFloats的形参是float**,传入时类型不匹配。函数内部*arr = malloc(...)的操作,是把malloc返回的堆内存地址写入了错误的内存位置,你输入的所有浮点值都存到了堆内存里,栈上的原matrix数组完全没有被写入,保留的是栈上的随机脏数据。同时malloc的内存没有释放,还存在内存泄漏问题。
  • 第二个错误:二维数组名指针运算逻辑错误,导致printFloats访问了非法内存
    二维数组名matrix默认退化为float (*)[5]类型的行指针,步长是5个float的大小,直接执行matrix + 10会跳过10*5个float的位置,远远超出了数组的合法范围,访问的是栈上的随机内存,所以输出大量乱码数值。
修复方案

你已经在栈上分配了完整的矩阵内存,不需要额外动态分配,直接修改scanFloats函数适配现有数组即可,完整修改后的代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 形参改为float*类型,直接接收每行的首地址
void scanFloats(float* arr, int size); 
void printFloats(float* arr, int size);

int main()
{
    float matrix[4][5];

    for (int i = 0; i < 4; i++)
    {
        // 直接传入每行首地址,类型匹配
        scanFloats(matrix[i], 5);
    }

    // 先强转为float*,保证指针运算步长为1个float
    printFloats((float*)matrix, 10);
    printFloats((float*)matrix + 10, 10);
    return 0;
}

void scanFloats(float* arr, int size)
{
    // 去掉多余的malloc操作,直接写入传入的数组内存
    for (int i = 0; i < size; i++) {
        printf("Enter number\n");
        scanf("%f", arr + i);
    }
}

void printFloats(float* arr, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%f\n", *(arr + i));
    }
}

修改后输入的数值会正确写入栈上的连续矩阵内存,强转为float*后逐元素访问符合预期,可正确打印前10个、后10个元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:48:08