C语言实现逐行整数流存入不同动态数组及现有代码修复
问题核心错误点
- 指针传参是值传递:你定义的
getInt_Stream(int *ptr)是值传递,函数内部对ptr的重新赋值(malloc/realloc的结果)完全不会影响外部main函数里的arr1、arr2,外部拿到的还是未初始化的野指针,自然无法读取数据。要修改外部指针本身的值,需要传二级指针int **ptr。
- 指针传参是值传递:你定义的
- 动态数组无法用
sizeof算长度:你定义的lent宏只能用在编译时确定大小的静态数组,动态数组的指针本身只占8字节(64位系统),sizeof(arr1)得到的是指针大小,不是数组元素总大小,必须单独用变量存储数组的元素个数。
- 动态数组无法用
- 字符存储类型错误:
char c无法正确存储EOF的值(EOF是int类型的-1),如果char是无符号类型会出现判断错误,应该改成int c。
- 字符存储类型错误:
- 数组长度计数逻辑缺失:当前逻辑只有遇到空格才会给计数i加1,行末尾的最后一个数字后面是换行符,不会触发计数加1,导致最终丢失最后一个数字,也无法得到正确的数组长度。
修改思路
- 调整
getInt_Stream的参数为二级指针,同时新增一个int指针参数,用来向外返回当前行的整数个数。 - 删掉不可用的
lent宏,用单独的变量存储两个数组的长度。 - 修正字符读取和数字解析逻辑,处理好行尾的数字计数。
- 增加内存释放逻辑,避免内存泄漏。
修改后可运行代码
#include <stdio.h> #include <stdlib.h> #define Malloc(n, type) (type *)malloc((unsigned)((n) * sizeof(type))) #define Realloc(ptr, n, type) (type *)realloc(ptr, (n) * sizeof(type)) // 第二个参数用来返回当前行的整数个数 void getInt_Stream(int **ptr, int *num_cnt) { int i = 0; *ptr = Malloc(i + 1, int); (*ptr)[i] = 0; // 初始化第一个元素为0 int c; while ((c = getchar()) != EOF && c != '\n') { if (c >= '0' && c <= '9') { (*ptr)[i] = (*ptr)[i] * 10 + (c - '0'); } else if (c == ' ') { i++; *ptr = Realloc(*ptr, i + 1, int); (*ptr)[i] = 0; } } // 行结束,i从0开始,总个数是i+1 *num_cnt = i + 1; } int main() { int *arr1, *arr2; int n1, n2; getInt_Stream(&arr1, &n1); getInt_Stream(&arr2, &n2); printf("第一行数组元素:\n"); for (int i = 0; i < n1; i++) { printf("arr1[%d] = %d\n", i, arr1[i]); } printf("\n第二行数组元素:\n"); for (int i = 0; i < n2; i++) { printf("arr2[%d] = %d\n", i, arr2[i]); } // 释放动态分配的内存 free(arr1); free(arr2); return 0; }
编译运行说明
用你提供的编译命令不会再有警告:gcc prog.c -o prog -Wall -Wextra
运行后输入两行数字即可得到正确输出。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

