C语言双数组输入问题:第二个数组无法接收全部输入求排查思路
问题原因分析
- 野指针未初始化:
main中声明的struct array x,其成员list和mlist是指向数组的指针,但没有分配内存或指向有效数组空间,属于野指针。用野指针执行scanf写入操作会触发未定义行为,可能导致数据写入非法内存,表现为第二个数组无法正常接收输入。 - 值传递无效:
input函数接收的是struct array的副本,即便指针有有效值,修改副本的指针也不会影响主函数中的原变量。 - 编译报错隐患:代码未定义
N,编译阶段会直接报错;input函数声明返回int类型,但函数体无return语句,违反C语言标准。
解决思路
- 定义数组大小并分配有效空间:先用
#define N 数值定义数组长度,在main中创建两个实际数组,再将结构体的指针成员指向这些数组。 - 改用指针传递结构体:将
input函数参数改为struct array *x,直接操作主函数中的结构体变量,避免值传递的副本问题。 - 修正函数返回值:若
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
相关产品推荐
相关产品推荐

