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

C语言双数组输入问题:第二个数组无法接收全部输入求排查思路

问题原因分析
  • 野指针未初始化:main中声明的struct array x,其成员list和mlist是指向数组的指针,但没有分配内存或指向有效数组空间,属于野指针。用野指针执行scanf写入操作会触发未定义行为,可能导致数据写入非法内存,表现为第二个数组无法正常接收输入。
  • 值传递无效:input函数接收的是struct array的副本,即便指针有有效值,修改副本的指针也不会影响主函数中的原变量。
  • 编译报错隐患:代码未定义N,编译阶段会直接报错;input函数声明返回int类型,但函数体无return语句,违反C语言标准。
解决思路
  1. 定义数组大小并分配有效空间:先用#define N 数值定义数组长度,在main中创建两个实际数组,再将结构体的指针成员指向这些数组。
  2. 改用指针传递结构体:将input函数参数改为struct array *x,直接操作主函数中的结构体变量,避免值传递的副本问题。
  3. 修正函数返回值:若input无需返回值,将返回类型改为void;若需返回输入状态,添加对应return语句。
修正后的示例代码
#include <stdio.h>
#define N 5  // 定义数组大小

struct array
{
    int (*list)[N];
    int (*mlist)[N];
};

// 改为指针传递,返回类型设为void
void input(struct array *x){
    int i, j;
    printf("Give the integer numbers for the first array: ");
    for(i = 0; i < N; i++){
        scanf("%d", *(x->list + i));
    }

    printf("Give the integer numbers for the second array: ");
    for(j = 0; j < N; j++){
        scanf("%d", *(x->mlist + j));
    }
}

int main(){
    struct array x;
    int arr1[N], arr2[N];  // 创建实际数组空间
    x.list = &arr1;        // 让结构体指针指向数组
    x.mlist = &arr2;

    input(&x);  // 传递结构体地址
    return 0;
}

也可以简化结构体设计,直接使用一维指针成员,代码更简洁:

#include <stdio.h>
#define N 5

struct array
{
    int *list;
    int *mlist;
};

void input(struct array *x){
    int i, j;
    printf("Give the integer numbers for the first array: ");
    for(i = 0; i < N; i++){
        scanf("%d", x->list + i);
    }

    printf("Give the integer numbers for the second array: ");
    for(j = 0; j < N; j++){
        scanf("%d", x->mlist + j);
    }
}

int main(){
    struct array x;
    int arr1[N], arr2[N];
    x.list = arr1;
    x.mlist = arr2;

    input(&x);
    return 0;
}

内容的提问来源于stack exchange,提问作者NIKOLAOS MITSOPOULOS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:57:44