Я попытался реализовать связанный связанный список в c. Я хотел иметь возможность использовать несколько экземпляров списка, и я хотел создать список в основной функции. Вот почему я решил реализовать его так, как я.C malloc valgrind - неинициализированная память в моей реализации с одним связанным списком
Код работает отлично, но меня беспокоит из-за вывода valgrind. Также я попытался использовать код в проекте во встроенной системе, и произошли странные ошибки.
Выход Valgrind является:
начиная ...
== 3570 == Условный переход или переход, зависит от величины неинициализированных (ов)
== 3570 == в 0x100000E8E : push_cfront (в ./map_test)
== 3570 == по 0x100000D4F: Основной (в ./map_test)
== 3570 == Неиницализированные значение было создано путем выделения кучи
== 3570 == в 0x100008EBB: таНос (в /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
== 3570 == от 0x100000E80: push_cfront (в ./map_test)
== 3570 == от 0x100000D4F: Основной (в ./map_test)
== 3570 ==
. ..готовление
Также он говорит мне, что я теряю один блок. Где я делаю ошибку, освобождая его
== 3570 == УТЕЧКИ РЕЗЮМЕ:
== 3570 == определенно потеряли: 16 байт в 1 блоках
== 3570 == косвенно потерянным : 0 байт в 0 блоков
== 3570 == возможно потеряно: 2064 байт в 1 блоках
== 3570 == еще достижимы: 0 байт в 0 блоков
== 3570 == подавлено: 24,525 байт в 186 блоков
Пожалуйста, дайте мне подсказку о том, где я пошло не так.
test.c:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "command_list.h"
int main() {
printf("starting...\n");
Clist * command_list = malloc(sizeof(Clist));
if (command_list == NULL) printf("Malloc Failed\n");
command_list->head = NULL;
//push_cback(command_list, 0);
push_cfront(command_list,1);
free_clist(command_list);
free(command_list);
printf("\n...finished\n");
return 0;
}
command_list.h:
#ifndef __COMMAND_LIST_H
#define __COMMAND_LIST_H
typedef struct cnode {
uint8_t command;
struct cnode * next;
} Cnode;
typedef struct clist {
Cnode * head;
} Clist;
void push_cback(Clist * list, uint8_t command);
void push_cfront(Clist * list, uint8_t command);
void free_clist(Clist * list);
#endif
command_list.с
void push_cfront(Clist * list, uint8_t command){
Cnode * new_node;
new_node = malloc(sizeof(Cnode));
if (new_node->next == NULL) {
return;
}
new_node->command = command;
new_node->next = list->head;
list->head = new_node;
}
void free_clist(Clist * list){
if (list->head == NULL){
return; //already empty
}
Cnode * current = list->head;
while (current->next != NULL){
Cnode* temp = current->next;
free(current);
current = temp;
}
free(current);
list->head = NULL;
}
На третьей строке '' push_cfront вы 'если (new_node-> следующая == NULL)' вы просто 'malloc'ed эту вещь; 'next' не установлен. Довольно уверен, что вы хотели использовать 'if (new_node == NULL)'. – WhozCraig
О, и реквизит для использования Valgrind. – WhozCraig
Я думаю, что вы должны проверить 'list == NULL', на всякий случай :) – niceman