2017-01-11 9 views
1

Я пытаюсь реализовать trie в C. Мой код компилируется правильно, но когда я запускаю его с valgrind, он показывает ошибку. вот проблематичная часть:Как установить всех детей в NULL в 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; 
} 

и вот отчет об ошибке:

== 3346 == Условный переход или шаг зависит от неинициализированных значения (ов)

== 3346 = = на 0x40076B: основные (exp.c: 21)

== значение 3346 == неинициализированного было создано распределением кучи

== 3346 == в т 0x4C2AB80: таНос (в /usr/lib/valgrind/vgpreload_memcheck-amd64->linux.so)

== 3346 == по 0x40075A: основная (exp.c: 20) `

Я думаю, я должен сказать, что явно

ne->chill = {NULL}; 

, но это приводит к ошибке компилятора «ожидаемое выражение»

Что я должен делать? Могу ли я пройти через весь массив, чтобы указать указатели на NULL?

+1

Сначала вы должны проверить 'ne'. Во-вторых, вы не должны читать неинициализированные объекты. «Могу ли я пройти через весь массив, чтобы указать указатели на NULL?» - Не используйте их значения. Но было бы проще просто следовать правилам C. – Olaf

ответ

2

петля является единственным способом, чтобы установить все указатели переносимых на значение NULL

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

Вы можете услышать предложения использовать calloc или memset. Но шаблон с нулевым битом не обязательно совпадает с значением NULL для указателя. Даже если многие платформы реализуют его таким образом.

+0

'memset (..., NULL);' не работает? – Stargateur

+0

@Stargateur: умный компилятор может преобразовать это в «memset» в любом случае (или сильно оптимизированный встроенный вариант), так как он должен знать, использует ли архитектура представление с полным битом-нулем для нулевых указателей. Оставьте детали реализации в toolchain (если только вы не определили это как проблему). – Olaf