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
相关产品推荐
相关产品推荐

