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

C语言实现逐行整数流存入不同动态数组及现有代码修复

问题核心错误点

    1. 指针传参是值传递:你定义的getInt_Stream(int *ptr)是值传递,函数内部对ptr的重新赋值(malloc/realloc的结果)完全不会影响外部main函数里的arr1、arr2,外部拿到的还是未初始化的野指针,自然无法读取数据。要修改外部指针本身的值,需要传二级指针int **ptr。
    1. 动态数组无法用sizeof算长度:你定义的lent宏只能用在编译时确定大小的静态数组,动态数组的指针本身只占8字节(64位系统),sizeof(arr1)得到的是指针大小,不是数组元素总大小,必须单独用变量存储数组的元素个数。
    1. 字符存储类型错误:char c无法正确存储EOF的值(EOF是int类型的-1),如果char是无符号类型会出现判断错误,应该改成int c。
    1. 数组长度计数逻辑缺失:当前逻辑只有遇到空格才会给计数i加1,行末尾的最后一个数字后面是换行符,不会触发计数加1,导致最终丢失最后一个数字,也无法得到正确的数组长度。

修改思路

  1. 调整getInt_Stream的参数为二级指针,同时新增一个int指针参数,用来向外返回当前行的整数个数。
  2. 删掉不可用的lent宏,用单独的变量存储两个数组的长度。
  3. 修正字符读取和数字解析逻辑,处理好行尾的数字计数。
  4. 增加内存释放逻辑,避免内存泄漏。

修改后可运行代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:06:03