如何输入并打印列数可变的二维动态矩阵?
解决变长二维数组的赋值与打印问题
你的核心问题是没有记录每行的列数,导致遍历数组时无法确定终止条件。ptr[i][j] != NULL的判断完全错误:ptr[i]是int*类型的数组,存储的是整数值,NULL是指针常量,两者类型不兼容;而且calloc会把int元素初始化为0,即便强行比较,也会把合法的0值当成终止信号。
正确的解决思路
需要额外维护一个数组,用来存储每行对应的列数,这样遍历的时候直接用这个列数来控制循环次数即可。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> int main() { int** ptr; int rows; // 新增数组存储每行的列数 int* col_counts; printf("enter number of rows..\n"); scanf("%d", &rows); // 分配行指针数组和列数存储数组 ptr = calloc(rows, sizeof(int*)); col_counts = malloc(rows * sizeof(int)); if (!ptr || !col_counts) { perror("Memory allocation failed"); return 1; } for (size_t i = 0; i < rows; i++) { int columns; printf("enter number of columns for row %zu..\n", i); scanf("%d", &columns); // 记录当前行的列数 col_counts[i] = columns; ptr[i] = calloc(columns, sizeof(int)); if (!ptr[i]) { perror("Row memory allocation failed"); // 内存分配失败时释放已分配资源,避免泄漏 for (size_t k = 0; k < i; k++) { free(ptr[k]); } free(ptr); free(col_counts); return 1; } } // 给数组赋值 for (size_t i = 0; i < rows; i++) { // 用当前行的列数控制循环 for (size_t j = 0; j < col_counts[i]; j++) { ptr[i][j] = j; } } // 打印数组内容 for (size_t i = 0; i < rows; i++) { printf("Row %zu: ", i); for (size_t j = 0; j < col_counts[i]; j++) { printf("%d ", ptr[i][j]); } printf("\n"); } // 释放所有内存 for (size_t i = 0; i < rows; i++) { free(ptr[i]); } free(ptr); free(col_counts); return 0; }
关键改动说明
- 新增
col_counts数组,专门存储每行的列数,彻底解决遍历终止条件的问题。 - 补充了内存分配失败的错误处理,避免内存泄漏。
- 赋值和打印循环都改用
col_counts[i]控制循环次数,替代错误的指针判断逻辑。 - 打印时增加行号标识,输出结构更清晰。
内容的提问来源于stack exchange,提问作者Ertugrul SAKA
相关产品推荐
相关产品推荐

