当我尝试向struct添加数据时程序崩溃

时间:2016-01-20 07:46:38

标签: 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 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时,

程序崩溃了。所有检查都确保输入符合项目规范。

2 个答案:

答案 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

的类型转换