C 当我尝试向结构添加数据时,程序崩溃
我有一个计划,在结构列表中添加新职位。结构定义为:C 当我尝试向结构添加数据时,程序崩溃,c,struct,C,Struct,我有一个计划,在结构列表中添加新职位。结构定义为: 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 dat
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时,程序崩溃。所有检查都确保输入符合项目规范。问题在于您没有为指向结构的指针分配内存
struct data*temp
无法在其字段中获取数据,除非您为其分配内存
结构尺寸如下所示:
temp = malloc (sizeof(struct data));
编辑:
删除了malloc的typecast指向您创建的数据结构的指针不会指向内存中的任何内容,因为它指向NULL。因此,当您试图调用函数
strcpy()
将数据复制到指针中时,程序会崩溃,因为它没有将数据复制到有效内存中
您可能需要对函数malloc()
进行一些研究,该函数允许您在堆上为tmp ptr分配内存
这样的东西应该足够了:
tmp = malloc(sizeof(struct data));
您还应该检查malloc()是否返回了可以通过添加以下行使用的内存:
assert(tmp != NULL);
注意:不要忘了包括
库。你从来没有为结构分配内存,tmp只是指向null,你在那里写东西会使程序崩溃。哦,请尝试以一致和可读的方式格式化你的代码(对于其他人)。一致的缩进和额外的换行符对可读性(以及可维护性)有很大的帮助。尝试分配内存,然后使用snprintf函数复制字符串。同样,我们迫切需要一个规范的副本来解释“我的程序将数据复制到未初始化的指针中,为什么它会崩溃”。如果有人得到比这更好的副本,请告诉我。除了类型转换以外的一切都有帮助。@PaulR也依赖于编译器。如果使用C++编译器编写< C> C>代码>代码,则需要类型转换。在C中这样做是不好的,因为void*
可以隐式地强制转换到任何其他指针,因此它是多余的。您不应该使用assert
检查malloc
的返回值: