使用malloc实现矩阵转置并打印:代码问题求助
矩阵转置代码问题排查与修复
嘿,我帮你梳理下这段代码里的问题,然后给你一份能正常运行的修正版本~
你的代码存在的几个关键问题:
- 缺少
stdlib.h头文件:malloc函数属于标准库函数,必须包含这个头文件才能正确编译,否则会触发隐式声明的警告或错误 main函数返回值不符合C标准:标准C要求main函数返回int类型,而不是void- 原矩阵的行内存分配不完整:你代码里
matrix1[i] = malloc(size...没写完,正确写法应该是malloc(sizeof(int) * colums1)来为每行分配对应列数的空间 - 转置矩阵的内存完全未分配:要生成转置矩阵,需要先以原矩阵的列数作为转置矩阵的行数,原矩阵的行数作为转置矩阵的列数来分配内存
- 缺少矩阵元素的填充逻辑:哪怕不在意具体数值,也需要给矩阵元素赋值(比如让用户输入或默认初始化),否则打印的是随机垃圾值
- 缺少打印原矩阵和转置矩阵的逻辑代码
- 未释放动态分配的内存:使用完动态数组后必须调用
free释放内存,避免内存泄漏
修复后的完整代码:
#include <stdio.h> #include <stdlib.h> // 新增:malloc和free需要这个头文件 int main() { // 修正:main返回int类型 int rows1, colums1, i, j; int** matrix1, ** transpose_matrix1; printf("enter rows and columns\n"); scanf("%d%d", &rows1, &colums1); // 分配原矩阵的内存 matrix1 = malloc(sizeof(int*) * rows1); for (i = 0; i < rows1; i++) { matrix1[i] = malloc(sizeof(int) * colums1); } // 填充原矩阵(这里用用户输入示例,你也可以改成随机值或固定值) printf("enter elements of the matrix:\n"); for (i = 0; i < rows1; i++) { for (j = 0; j < colums1; j++) { scanf("%d", &matrix1[i][j]); } } // 分配转置矩阵的内存:行数是原矩阵的列数,列数是原矩阵的行数 transpose_matrix1 = malloc(sizeof(int*) * colums1); for (i = 0; i < colums1; i++) { transpose_matrix1[i] = malloc(sizeof(int) * rows1); } // 生成转置矩阵 for (i = 0; i < rows1; i++) { for (j = 0; j < colums1; j++) { transpose_matrix1[j][i] = matrix1[i][j]; } } // 打印原矩阵 printf("\nOriginal Matrix:\n"); for (i = 0; i < rows1; i++) { for (j = 0; j < colums1; j++) { printf("%d ", matrix1[i][j]); } printf("\n"); } // 打印转置矩阵 printf("\nTransposed Matrix:\n"); for (i = 0; i < colums1; i++) { for (j = 0; j < rows1; j++) { printf("%d ", transpose_matrix1[i][j]); } printf("\n"); } // 释放原矩阵内存 for (i = 0; i < rows1; i++) { free(matrix1[i]); } free(matrix1); // 释放转置矩阵内存 for (i = 0; i < colums1; i++) { free(transpose_matrix1[i]); } free(transpose_matrix1); return 0; // 修正:main函数返回0表示正常结束 }
代码说明:
- 我把
printf_s和scanf_s改成了标准的printf和scanf,这样代码兼容性更好(如果你必须用带_s的安全函数,改回去就行) - 新增了矩阵元素输入的逻辑,你也可以根据需求改成自动赋值(比如
matrix1[i][j] = i*colums1 + j;) - 补充了完整的内存释放步骤,避免内存泄漏
内容的提问来源于stack exchange,提问作者Or Simhon
相关产品推荐
相关产品推荐

