条件跳转或移动取决于 LinkedList 中未初始化的值

Conditional jump or move depends on uninitialised value(s) in LinkedList

我不断收到函数 printList() 和 freeList() 的条件跳转或移动取决于 Valgrind 中未初始化的值。我读了几篇文章,问题是因为 head 在 malloc() 之后没有初始化,所以我在我的 createList() 函数中的 malloc 之后添加了 newList->head = NULL 。我不确定如何解决此错误。非常感谢任何帮助!我真的是 C 的新手所以我真的不知道问题是什么...

typedef struct node{
    int year;
    int win;
    struct node* next;
}node_t;

typedef struct slist{
        node_t* head;
        int size;
}slist_t;

node_t* makeNode(int year, int win){
        node_t* newNode = (node_t*) malloc(sizeof(node_t));
        if (newNode == NULL){
            return NULL;
        }
        newNode->year = year;
        newNode->win = win; 
        return newNode;
}

void freeNode(node_t* node){
        if (node == NULL){
            return;
        }
        free(node);
}

slist_t* createList(){
    
        slist_t* newList = (slist_t*) malloc(sizeof(slist_t));
        
    if (newList == NULL){
            return;
    }   
    newList->head = (node_t*) malloc(sizeof(node_t));
    newList->head = NULL;   
    newList->size = 0;
    return newList;
}

node_t*  addFirst(slist_t* list, int year, int win){
    node_t* node = makeNode(year, win); 
    
    if (list == NULL){
        return;
    }
    
    if (node == NULL){
        return;
    }
    if (list->head == NULL){
            list->head = node;
    }   
    else{
        node->next = list->head;
        list->head = node;
    }
    list->size += 1;
    return node;
}

void printList(slist_t* list){
    if (list == NULL){
        return;
    }
    node_t* itr = list->head;
    while(itr != NULL){
        printf("%d, %d wins\n", itr->year, itr->win);
        itr = itr->next;
    } 
    printf("\n");
}
void freeList(slist_t* list){
    node_t* node = list->head;
    while (node){
        node_t* temp = node;
        node = node->next;
        free(temp);
    }
    free(list); 
}
int main(){
    slist_t* list = createList();
    
    addFirst(list, 2014, 71);
    addFirst(list, 2015, 78);
    addFirst(list, 2016, 93);
    addFirst(list, 2017, 93);
    addFirst(list, 2018, 108); 

    printList(list);
    freeList(list);
    
    return 0;
}

问题是 makeNode 没有初始化 newNode->next。如果它的值恰好为 0 (NULL),一切正常,但尝试在 makeNode 中添加此语句,然后 运行 程序:

newNode->next = 1000000;

现在您更有可能遇到分段错误或其他一些奇怪的行为。所以添加这一行:

newNode->next = NULL;

不是你的问题,但这个分配序列会产生内存泄漏:

newList->head = (node_t*) malloc(sizeof(node_t));
newList->head = NULL;   

分配内存后,您会立即失去对它的引用,方法是用 NULL 覆盖该引用。你应该放弃这两项任务中的第一项。第一个节点稍后创建,当您调用 addFirst 时,因此不应在此处分配任何节点。