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

C语言创建指向整数列表的动态指针数组的代码纠错与实现咨询

代码问题排查

  • 内存分配长度不符合要求:需求明确每个列表要分配n+1长度的数组存储长度+元素,你当前只分配了n个int的空间,缺少存储长度的位置
  • 输入下标用错:内层循环输入元素时使用了外层循环变量i作为下标,会直接触发内存越界,程序大概率崩溃
  • 指针未关联到二级数组:每个分配好的列表指针b没有赋值给A[i],循环结束后所有输入的数据都无法访问,同时造成内存泄漏
  • 缺少内存释放逻辑:申请的堆内存没有主动释放,不符合C语言内存管理规范

符合需求的实现代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m, n, i, j, **A;

    printf("请输入整数列表的个数:\n");
    scanf("%d", &m);
    // 分配二级指针数组,长度为m
    A = (int**)malloc(m * sizeof(int*));
    if (A == NULL) {
        printf("内存申请失败\n");
        return 1;
    }

    for (i = 0; i < m; i++) {
        printf("请输入第%d个列表的长度:\n", i + 1);
        scanf("%d", &n);
        // 按需求分配n+1长度的数组,首位存列表长度
        int *b = (int*)malloc((n + 1) * sizeof(int));
        if (b == NULL) {
            printf("内存申请失败\n");
            // 释放已申请的内存避免泄漏
            for (int k = 0; k < i; k++) {
                free(A[k]);
            }
            free(A);
            return 1;
        }
        b[0] = n;
        // 输入n个整数填充数组剩余位置
        printf("请输入第%d个列表的%d个整数(非递减顺序):\n", i + 1, n);
        for (j = 1; j <= n; j++) {
            scanf("%d", &b[j]);
        }
        // 将当前列表指针存入二级数组
        A[i] = b;
    }

    // 下方可添加后续业务逻辑,示例为打印所有列表验证输入正确性
    /*
    printf("\n输入的所有列表如下:\n");
    for (i = 0; i < m; i++) {
        int len = A[i][0];
        printf("列表%d(长度%d):", i + 1, len);
        for (j = 1; j <= len; j++) {
            printf("%d ", A[i][j]);
        }
        printf("\n");
    }
    */

    // 释放所有申请的内存
    for (i = 0; i < m; i++) {
        free(A[i]);
    }
    free(A);
    return 0;
}

后续操作提示

  • 后续如果要操作列表数据,直接读取A[i][0]即可拿到第i个列表的长度,遍历A[i][1]到A[i][A[i][0]]就能获取所有元素
  • 因为题目默认输入为非递减顺序,不需要额外做排序处理,可直接基于有序特性做合并、查找等后续操作

内容的提问来源于stack exchange,提问作者Divya Roopam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 06:36:08