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
的返回值: