Первый и второй продолжается, а третий возвращается NULL - PullRequest
0 голосов
/ 15 июня 2019

Эта программа проверяет наличие дубликатов, первый раз она не сообщает мне, что идентификатор уже существует, но в третий раз функция finddata возвращает ноль, и это происходит независимо от того, что она читает (в исходном коде finddata внутри функции while).

Попробовал разные компиляции идентификаторов, изменил тип finddatta (хотя я бы хотел этого избежать) и запустил функцию в другом порядке

typedef struct{
    char name[MAXSTRING];
    int id;
} structure;
typedef struct node node;
typedef struct list list;

struct node {
    structure data;
    node* next;
};

struct list {
    node* head;
    int size;
};

list* list_create(){
    list* l=(list*) malloc(sizeof(list));
    assert(1);
    l->head=malloc(sizeof(node));
    l->size=0;
    return l;
}


node* finddata(int id,list* l){
        node* tmp=l->head;
        while(tmp->next!=NULL){
        if(tmp->data.id==id){
             return tmp;
        }
        tmp=tmp->next;
        }
        return NULL;
}


int main(int argc,char *argv[]){
    list* l=list_create();

    if(argc!=2){
        printf("Input Error\n");
    }

    node* found=(node*)malloc(sizeof(node));
    node* st=(node*)malloc(sizeof(node));

    if(found==NULL){
        printf("Error allocating memory\n");
        return 0;
    }

    printf("Give a name\n");
    scanf("%s",st->data.name);
    printf("Give id\n");
    scanf("%d",&st->data.id);

    found=finddata(st->data.id,l); 

    if(found!=NULL){
        printf("This id already exists\n");
    }          
    else{
        //Some Code
    }
    //Some more code
    return 0;
}

Я хочу, чтобы найденный не возвращал ноль.

1 Ответ

0 голосов
/ 15 июня 2019

В list_create вы выделяете пространство для node, но никогда не устанавливаете значения узла на что-либо. В частности, указатель next (l->head->next) неинициализирован. Когда вы получаете доступ к этому во время finddata, может произойти все что угодно: от программы, которая работает, до работы несколько раз, затем неуспешно, до полного сбоя.

Вы должны обязательно инициализировать все значения в выделенной памяти, прежде чем пытаться читать из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...