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

如何输入并打印列数可变的二维动态矩阵?

解决变长二维数组的赋值与打印问题

你的核心问题是没有记录每行的列数,导致遍历数组时无法确定终止条件。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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:48:19