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
相关产品推荐
相关产品推荐

