2017-01-11 7 views
1

Ich versuche, einen Trie in C zu implementieren. Mein Code kompiliert korrekt, aber wenn ich es mit Valgrind ausführen zeigt es einen Fehler. hier ist der problematischste Teil:Wie setze ich alle Kinder auf Null im Trie

typedef struct node { 
bool end; 
struct node *chil[26]; 
} NODE; 
int main() 
{ 
    NODE* ne = (NODE*)malloc(sizeof(NODE)); 
    if(ne->chil[1] == NULL) printf("\nzwycięstwo!\n"); 
    free(ne); 
    return 0; 
} 

und hier wird der Fehlerbericht:

== == 3346 Bedingter Sprung oder bewegen sich auf nicht initialisierten Wert hängt (n)

== 3346 = = at 0x40076B: main (exp.c: 21)

== == 3346 Uninitialised-Wert wurde durch eine Heapzuordnung erstellt

== == 3346 a t 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64->linux.so)

== == 3346 von 0x40075A: main (exp.c: 20) `

I ausdrücklich denke, ich muss sagen, dass

ne->chill = {NULL}; 

aber dies führt zu Compiler-Fehler „expected Ausdruck“

Was soll ich tun? Kann ich vermeiden, das gesamte Array durchzugehen, um Zeiger auf NULL zu setzen?

+1

Zuerst sollten Sie 'ne' selbst überprüfen. Zweitens sollten Sie nicht initialisierte Objekte nicht lesen. "Kann ich vermeiden, das gesamte Array zu durchlaufen, um Zeiger auf NULL zu setzen?" - Verwenden Sie ihre Werte nicht. Aber es wäre einfacher, C-Konventionen zu folgen. – Olaf

Antwort

2

Eine Schleife ist der einzige Weg, um alle Zeiger portably auf einen Nullwert setzen

for (int i = 0; i < 26; ++i) 
    ne->chil[i] = NULL; 

Sie hören können Vorschläge calloc oder memset zu verwenden. Aber ein Null-Bit-Muster ist nicht notwendigerweise dasselbe wie ein NULL-Wert für einen Zeiger. Auch wenn viele Plattformen es so implementieren.

+0

'memset (..., NULL);' nicht funktionieren? – Stargateur

+0

@Stargateur: Ein cleverer Compiler könnte dies trotzdem in "memset" umwandeln (oder eine stark optimierte Inlined-Variante), da er wissen sollte, ob die Architektur für Nullzeiger eine All-Bits-Zero-Darstellung verwendet. Lassen Sie die Implementierungsdetails in der Toolchain (sofern Sie dies nicht als Problem erkannt haben). – Olaf

Verwandte Themen