指向结构数组的指针在输入值时崩溃

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-&gt;accno); 也应该是 scanf("%d", &amp;ptr-&gt;accno);ptr-&gt;balance。打开编译器警告。 @WeatherVane 确实可以以某种方式工作,但您能否解释一下原因或方式,或提供一些有效的来源。 tysm。 因为ptr-&gt;accno是数据值,而不是scanf函数族需要的成员地址。然而(ptr)-&gt;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");        
    

【讨论】:

&amp; 中的 scanf("%s",&amp;(ptr-&gt;name)) 充其量是不必要的,而且很可能是完全错误的。 @JohnBollinger 是的,你在写!没必要谢谢你的观点!【参考方案2】:

您没有给出struct bankcc 的定义,但推测其成员accnobalance 分别是intfloat,而不是指向相同的指针。在这种情况下,您需要将 scanf 指针传递给这些,例如 scanf("%d",&amp;ptr-&gt;accno)

此外,如果struct bankaccname 成员是char 的(足够长的)数组或指向足够大空间以容纳输入的名称的指针,则scanf("%s",(ptr)-&gt;name) 可以(-ish )。但除此之外——例如,如果它是一个char *,它还没有被分配指向任何存储——那么scanf也是无效的。您需要将有效指针传递给足够大的空间以接收输入。

【讨论】:

以上是关于指向结构数组的指针在输入值时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何输出指针所指向的ŀ

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

C - 指向结构指针的指针 - 分段错误

C 语言二级指针作为输入 ( 指针数组 | 将 二级指针 作为函数输入 | 抽象函数业务逻辑 )

c语言如何给结构体指针赋值?

C语言 用指针访问的方式 输入3个数,输出最小值 要分析过程,谢谢