Ich habe versucht, eine einfach verlinkte Liste in c zu implementieren. Ich wollte in der Lage sein, mehrere Instanzen der Liste zu verwenden, und ich wollte die Liste in der Hauptfunktion erstellen. Deshalb habe ich beschlossen, es so zu implementieren, wie ich es getan habe.C malloc valgrind - nicht initialisierter Speicher in meiner Implementierung der einfach verknüpften Liste
Der Code funktioniert einwandfrei gut, aber ich bin besorgt wegen der Ausgabe Valgrind erstellt. Auch habe ich versucht, den Code in einem Projekt auf einem eingebetteten System zu verwenden und seltsame Fehler passieren.
valgrind Die Ausgabe ist:
gestartet ...
== == 3570 Bedingter Sprung oder bewegen, hängt von uninitialised Wert (e)
== == 3570 bei 0x100000E8E : push_cfront (in ./map_test)
== == 3570 durch 0x100000D4F: main (in ./map_test)
== == 3570 Uninitialised Wert wurde durch eine Heapzuordnung erstellt
== == 3570 bei 0x100008EBB: malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
== == 3570 durch 0x100000E80: push_cfront (in ./map_test)
== == 3570 durch 0x100000D4F: main (in ./map_test)
== == 3570
. ..finish
Auch es sagt mir, dass ich einen Block verliere. Wo mache ich einen Fehler zu befreien es
== == 3570 LEAK ZUSAMMENFASSUNG:
== == 3570 definitiv verloren: 16 Bytes in 1 Blöcke
== 3570 == indirekt verloren : 0 0 Bytes in Blöcken
== == 3570 möglicherweise verloren: 2.064 Bytes in Blöcken 1
== == 3570 noch erreichbar: 0 0 Bytes in Blöcken
== == 3570 unterdrückt: 24.525 Bytes in 186 Blöcke
Bitte geben Sie mir einen Hinweis auf, wo ich schief gelaufen ist.
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.c
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;
}
In der dritten Zeile von '' push_cfront Sie tun 'if (new_node-> nächste == NULL)' Sie nur 'das Ding malloc'ed; 'next' ist nicht gesetzt. Ziemlich sicher, dass Sie 'if (new_node == NULL)' verwenden wollten. – WhozCraig
Oh, und Requisiten für die Verwendung von Valgrind. – WhozCraig
Ich denke, du solltest nach 'list == NULL' suchen, nur für den Fall :) – niceman