for (i=0;i<numchars;i++) {
codearray[i]=(char*)malloc(100*sizeof(char));
}
это код, о котором вы говорите?на самом деле это не код инициализации, он освобождает место для кода данных.
char** codearray=(char**)malloc(numchars*sizeof(char*));
просто создает вам массив char *, но они не указывают на допустимую память.Итак, ваш «код инициализации» просто гарантирует, что ваша память создана правильно.
Другая вещь, которая меня действительно пугает, это то, что ваша переменная-счетчик является статической.вызов
printtree_inorder(root,code,letarray,codearray);
printtree_inorder(root,code,letarray,codearray);
также закончится ошибкой сегментации, поскольку счетчик будет> затем numchars при повторном вызове (извне).Итак, давайте немного переписаем ваш код и сделаем его более безопасным
char* code = (char *)malloc(numchars + 1);
memset(code, 0, numchars + 1);
char* letarray = (char *)malloc(numchars + 1);
memset(letarray, 0, numchars + 1);
char** codearray = (char **)malloc(numchars * sizeof(char *));
memset(codearray, 0, numchars * sizeof(char *));
printtree_inorder(root, code, letarray, codearray, 0);
free(code);
// do not forget the free the other allocations later as well as
void printtree_inorder(node* n,char* code,char* letarray,char** codearray, int counter)
{
if (n == NULL) {
return;
}
appenddigit(code,'0');
printtree_inorder(n -> left,code,letarray,codearray, counter);
remdigit(code);
if (n->let!='\0')
{
letarray[counter] = n->let;
codearray[counter] = strdup(code);
++counter;
}
appenddigit(code,'1');
printtree_inorder(n -> right,code,letarray,codearray, counter);
remdigit(code);
}