C语言二维数组打印函数在main函数中调用无法正常输出问题求助
问题原因
- 内存分配语句运算符错误
readMatrix函数中给二级指针分配内存的语句错用了相等判断符==,而不是赋值符=,导致malloc申请的内存地址根本没有赋值给mat变量,mat全程为未初始化的野指针:
// 错误写法 mat==(int**)malloc(lin*sizeof(int*)); // 修正后 mat = (int**)malloc(lin * sizeof(int*));- 内存分配语句运算符错误
- 函数未返回有效指针
readMatrix声明了int**类型的返回值,但函数执行结束后没有写return mat;语句,main函数中赋值得到的mat是随机垃圾值,访问该地址属于未定义行为,自然无法正常打印。
- 函数未返回有效指针
- 额外优化项:
readMatrix的第一个参数int** mat完全多余,你不需要从外部传入未初始化的野指针,直接在函数内部创建二级指针后返回即可。
修复后完整代码
#include <stdio.h> #include <stdlib.h> void print(int** mat, int lin, int col) { int i,j; printf("Matrix is:\n"); for(i=0; i<lin; i++) { for(j=0; j<col; j++) { printf("%d ", *(*(mat+i)+j)); } printf("\n"); } } int** readMatrix(int lin, int col) { int x; int i,j; // 修正运算符错误 int** mat = (int**)malloc(lin*sizeof(int*)); for(x=0; x<lin; x++) { mat[x]=(int*)malloc(col*sizeof(int)); } for(i=0; i<lin; i++) { printf("Line %d: ", i); for(j=0; j<col; j++) { scanf("%d", &mat[i][j]); } } // 补充返回值 return mat; } int main() { int lin, col; printf("Enter number of lines: "); scanf("%d", &lin); printf("Enter number of cols: "); scanf("%d", &col); // 调用时不需要传入mat参数 int** mat = readMatrix(lin,col); print(mat,lin,col); // 补充内存释放逻辑,避免泄漏 for(int i=0; i<lin; i++) { free(mat[i]); } free(mat); return 0; }
为什么readMatrix内部调用print能正常运行
这是未定义行为的随机表现:你在readMatrix内部访问野指针时,刚好对应内存地址未被系统保护、可正常读写,所以可以临时打印内容,但函数返回后栈内存被回收,main拿到的垃圾地址无法访问,就会出现打印失败、甚至程序崩溃的情况。
内容的提问来源于stack exchange,提问作者Vali RO
相关产品推荐
相关产品推荐

