ошибка во время выполнения: нулевой указатель передан в качестве аргумента 1, который объявлен никогда не равным нулю - PullRequest
0 голосов
/ 30 января 2019

Я написал программу, которая создает списки ссылок с двумя значениями.Это работало, когда у меня были только значения int, но теперь, когда я добавил char *, это сообщение об ошибке показывает ошибку во время выполнения: нулевой указатель передан как аргумент 1, который объявлен как null

Как упоминалось ранее, это работало нормальнопока я не добавил char * в конструктор и структуру.Не уверен, что это не так, потому что ошибка появляется в разных строках кода каждый раз, когда я ее запускаю ... Так что мне нужно изменить?

   #include <stdio.h>
   #include <cs50.h>
   #include <string.h>

typedef struct node  {
        int val;
        char* name;
        struct node *next;
} node_t;

void addFirst(int value, char* word, node_t** nd) {
        //initialize new node, allocate space, set value
    node_t * tmp;
    tmp = malloc(sizeof(node_t));
    tmp->val = value;
    strcpy(tmp->name, word);
    //let the new nodes next pointer point to the old head
    tmp->next = *nd;
    //Make tmp the head node
    *nd = tmp;



}


int findItem(int value,char* word, node_t *nd) {
    if(nd->val == value)
    return 0;
    while(nd->next != NULL) {
    if(nd->val == value && strcmp(word, nd->name) == 0)
    return 0;

    if(nd->next != NULL)
    nd = nd->next;
    }
    return -1;

}


int main (void) {

 node_t *head = malloc(sizeof(node_t));
 head->val = 0;
  strcpy(head->name, "");
    head->next = NULL;
    addFirst(15, "word", &head);
    addFirst(14,"word2", &head);


    printf("%i \n", findItem(15, "word", head));

}

1 Ответ

0 голосов
/ 30 января 2019

Проблема в strcpy(head->name, "");.Здесь вы пытаетесь использовать указатель ячейки памяти на head->name, но вы никогда не назначали ей действительную память.

Необходимо убедиться, что указатель указывает на действительную ячейку памяти, прежде чемВы пишете / читаете из этой памяти.Попытка доступа к недопустимой памяти вызывает неопределенное поведение .

Это применимо и к другим неинициализированным экземплярам name.

Если вы можете жить по стандарту POSIX, вместо strcpy(), вы можете использовать strdup()

...