我有一个程序可以为结构列表添加新的位置。结构定义是:
struct data
{
char name[50];
char surname[50];
float income;
float taxed_income;
char account[20];
char id[10];
struct data *next, *prev;
};
和添加数据的功能是:
struct data* add_element()
{
struct data *tmp;
bool flag=true;
float input;
char inpt[50];
tmp = NULL;
do {
printf("Id: ");
fgets(inpt,49,stdin);
if(head != NULL)
flag=id_check(inpt);
}
while(!flag);
strcpy(tmp->id,inpt);
do {
printf("Name: ");
fgets(inpt,49,stdin);
flag=check(inpt);
}
while(!flag);
strcpy(tmp->name,inpt);
do {
printf("Surname: ");
fgets(inpt,49,stdin);
flag=check(inpt);
}
while(!flag);
strcpy(tmp->surname,inpt);
do {
printf("Account: ");
fgets(inpt,49,stdin);
flag=check_num(inpt);
}
while(!flag);
strcpy(tmp->account,inpt);
printf("Income: ");
scanf("%f",&input);
tmp->income=input;
printf("taxed Income: ");
scanf("%f",&input);
tmp->taxed_income=input;
return tmp;
}
当我达到第一个strcpy时,程序崩溃了。所有检查都确保输入符合项目规范。
答案 0 :(得分:2)
指向您创建的数据结构的指针不指向内存中的任何内容,因为它指向NULL。因此,当您尝试调用函数strcpy()
将数据复制到指针时,程序崩溃,因为它没有将数据复制到有效的内存中。
你可能想对函数malloc()
做一些研究,它允许你为你的tmp ptr在堆上分配内存。
这样的事情应该足够了:
tmp = malloc(sizeof(struct data));
您还应该检查malloc()是否通过添加以下行来返回可以使用的内存:
assert(tmp != NULL);
注意:不要忘记包含<assert.h>
库。
答案 1 :(得分:-1)
问题是您没有为指向结构的指针分配内存。
除非您分配内存,否则 struct data *temp
无法在其字段中获取数据
结构大小如下:
temp = malloc (sizeof(struct data));
编辑: 删除了malloc
的类型转换