指向结构数组的指针在输入值时崩溃
Posted
技术标签:
【中文标题】指向结构数组的指针在输入值时崩溃【英文标题】:Pointer to array of structs crashing upon inputting value 【发布时间】:2021-12-25 02:36:14 【问题描述】:我正在学习指针、结构和 AoS 以及它们之间的关系,我试图制作一个简单的 C 代码,它使用指针从用户那里获取输入。但是,无论我尝试什么,我都遇到了 Seg 错误,例如在代码中:每当我尝试输入余额时,代码在每次运行时都会崩溃,如果代码不正确,为什么在名称或 accno 输入,以及执行此任务的正确方法。
void input(struct bankacc b[],int n)
struct bankacc *ptr=NULL;
ptr=b;
for(;ptr<(b+n);ptr+=1)
printf("Enter name: ");
scanf("%s",(ptr)->name);
printf("Enter account number: ");
scanf("%d",ptr->accno);
printf("Enter balance: ");
scanf("%f",ptr->balance);
printf("_____ \n");
代码图片:https://i.stack.imgur.com/JREvb.png
【问题讨论】:
scanf("%d", ptr->accno);
也应该是 scanf("%d", &ptr->accno);
和 ptr->balance
。打开编译器警告。
@WeatherVane 确实可以以某种方式工作,但您能否解释一下原因或方式,或提供一些有效的来源。 tysm。
因为ptr->accno
是数据值,而不是scanf
函数族需要的成员地址。然而(ptr)->name
衰减指向数组第一个元素的指针。
【参考方案1】:
你忘记获取结构体成员的地址了:
void input(struct bankacc b[],int n)
struct bankacc *ptr=NULL;
ptr = b;
for(;ptr<(b+n);ptr+=1)
printf("Enter name: ");
scanf("%s", ptr->name);
printf("Enter account number: ");
scanf("%d", &(ptr->accno));
printf("Enter balance: ");
scanf("%f",&(ptr->balance));
printf("_____ \n");
【讨论】:
&
中的 scanf("%s",&(ptr->name))
充其量是不必要的,而且很可能是完全错误的。
@JohnBollinger 是的,你在写!没必要谢谢你的观点!【参考方案2】:
您没有给出struct bankcc
的定义,但推测其成员accno
和balance
分别是int
和float
,而不是指向相同的指针。在这种情况下,您需要将 scanf
指针传递给这些,例如 scanf("%d",&ptr->accno)
。
此外,如果struct bankacc
的name
成员是char
的(足够长的)数组或指向足够大空间以容纳输入的名称的指针,则scanf("%s",(ptr)->name)
可以(-ish )。但除此之外——例如,如果它是一个char *
,它还没有被分配指向任何存储——那么scanf
也是无效的。您需要将有效指针传递给足够大的空间以接收输入。
【讨论】:
以上是关于指向结构数组的指针在输入值时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )