bzero
просто обнуляет память. bzero(addr, size)
по существу эквивалентно memset(addr, 0, size)
. Что касается того, почему вы используете его, из того, что я видел примерно в половине случаев его использования, это просто потому, что кто-то, хотя обнуление памяти казалось хорошей идеей, даже если она ничего не достигла. В этом случае, похоже, что эффектом будет установка для некоторых указателей значения NULL (хотя это не совсем переносимо для этой цели).
Для рекурсивного размещения вы должны просто отслеживать текущую глубину и размещать дочерние узлы, пока не достигнете желаемой глубины. Код что-то в этом заказе сделает работу:
void alloc_tree(dict **root, size_t depth) {
int i;
if (depth == 0) {
(*root) = NULL;
return;
}
(*root) = malloc(sizeof(**root));
for (i=0; i<M; i++)
alloc_tree((*root)->children+i, depth-1);
}
Я должен добавить, что я не могу себе представить, что такое рекурсивное распределение. В типичном случае вы вставляете данные и выделяете новые узлы, необходимые для хранения данных. Точные детали этого будут зависеть от того, поддерживаете ли вы дерево (и если да, то как). Для такого многогранного дерева довольно часто используется какой-то вариант B-дерева, и в этом случае приведенный выше код обычно не применяется вообще - с B-деревом вы заполняете узел, и когда он достигает своего предела, вы разделяете его пополам и продвигаете средний элемент на родительский узел. Вы выделяете новый узел, когда он достигает вершины дерева, а корневой узел уже заполнен.