指向结构的指针未按预期工作

时间:2016-02-04 14:58:09

标签: c pointers structure

尝试将结构引用传递给函数以输入数据,但由于某种原因,程序面临运行时问题和崩溃。有人可以说出原因吗?

#include<stdio.h>
int getdata(struct bank *);

struct bank {
char name[40], ac_no[20];
float balance;
};

int main()
{
    struct bank customer[5];
    struct bank *p;
    int i;
    for (i = 0;i < 5;i++)
    {
        p = &customer[i];
        getdata(&p);
    }   
    getchar();
    return 0;
}
int getdata(struct bank *ptr)
{
    printf("Enter Name: ");
    gets((ptr->name));
    printf("Enter A/C Number: ");
    gets((ptr->ac_no));
    printf("Enter Balance: ");
    scanf("%f",ptr->balance);
    return 0;
}

编辑: ptr-&gt;余额导致程序崩溃,无法弄明白:|

2 个答案:

答案 0 :(得分:4)

只需从&删除运营商的getdata(&p)地址即可。 &p的类型为struct bank **p,这意味着编译器应该对此发出警告,并且您已忽略该警告。

此外,永远不要使用gets()这是一个危险的功能,并且在最近的标准中已被弃用。

答案 1 :(得分:2)

您的代码无效。首先,声明为函数bank的参数的结构getdata与函数后声明的结构bank不同。

#include<stdio.h>
int getdata(struct bank *);
            ^^^^^^^^^^^
struct bank {  // this is another structure
^^^^^^^^^^^
char name[40], ac_no[20];
float balance;
};

改为写。

#include<stdio.h>

struct bank {
char name[40], ac_no[20];
float balance;
};

int getdata(struct bank *);

这是在结构定义之后放置函数声明。

此函数调用

getdata(&p); 

也无效,因为表达式&p的类型为struct bank **,而参数的类型为struct bank *

getdata( p );

函数gets不安全,C标准不再支持。请改为使用fgetsscanf来指定要读取的字符数。