Core Dumped()

meu código fica dando core dumped


#include <stdio.h>
#include <stdlib.h>

//estruturas
#define true 1
#define false 0


typedef int bool;
typedef int Tipo_Chave;

// ------------------------------------
//| esse é o objeto nó, cada nó vai ter essas variaveis, é possivel 
//| adcionar outras caso seja necessário, como nome de usuario, id, ?
//| etc...
// ------------------------------------

typedef struct no{
  Tipo_Chave chave;
  struct no * filhos[1000];
}node;//node é nó em ingles, usei pq ja tinha no



// ------------------------------------
//|  TAD árvore
//|  Precisamos de: Iniciar a árvore 
//| (alocar a memória e os primeiros valores)
//| Inserir Filho (inserir um nó filho para um nó pai)
//| Imprimir (mostrar a lista de filhos em ordem)
//| Busca chave
// ------------------------------------

// ------------------------------------
//| ***Inicializar***
// ------------------------------------

// ---------------------------
//| essa função cria um novo nó
// ---------------------------
node* criar_novo_no(Tipo_Chave chave_aux){
  int i;
  node * novo_no = (node*)malloc(sizeof(node));
  novo_no->chave = chave_aux;
  for(i =0; i < 1000; i++){
    
  }
  return(novo_no);
}

// ---------------------------
//| essa função inicializa
// ---------------------------

node * inicializa_arvore(Tipo_Chave chave_aux){
  return(criar_novo_no(chave_aux));
}


// ------------------------------------
//| ***Busca_Chave***
// ------------------------------------
node * busca_Chaves(Tipo_Chave chave_aux, node * raiz){
  //se a raiz for nula, nao existe, ai ele retorna null
  if(raiz == NULL){
    return(NULL);
  }
  //se a chave da raiz for = a chave aux q inserimos na função, 
  if(raiz->chave == chave_aux){
      return(raiz);
  }
  int i;
  //pego o primeiro filho pra ter um inicio
  node * p = raiz->filhos[0];
  for(i = 0; i< 1000; i++){
    p = p->filhos[i];
    while(p != NULL){
      node * resp = busca_Chaves(chave_aux, p);
      if(resp->filhos[i] != NULL){
        return(resp);
      }
    } 
  }
  return(NULL);
}


// ------------------------------------
//| ***Inserir***
// ------------------------------------

bool insere(node * raiz, Tipo_Chave nova_chave, Tipo_Chave chave_pai){
  int i;
  //verificar se o pai existe
  node * pai = busca_Chaves(chave_pai, raiz);
  
  if(pai == NULL){
    return(false);
  } 

  node * filho = criar_novo_no(nova_chave);//cria novo no pro filhos
  node * p = pai->filhos[0];//pega o primeiro filho do pai
  if(p == NULL){//se o pai não tiver primeiro filho ele ganha o primeiro 
    pai->filhos[0] = filho;
  }else{
    while(p->filhos[i] != NULL){
      i++;
    }
    p->filhos[i] = filho;
  }
  return(true);
}

// ------------------------------------
//| ***Imprimir***
// ------------------------------------

void exibirArvore(node * raiz){
  int i;
  if(raiz == NULL) return;

  printf("(%d", raiz->chave);
  node * p = raiz->filhos[0];
  while(p != NULL){
    exibirArvore(p);
    i++;
    p = p->filhos[i];
  }

  printf(")"); 
}


int main(){
  int numero_de_membros, numero_de_filiacoes, i = 0;
  int filho, pai;

  printf("Insira a quantidade de membros da familia: ");
  scanf("%i", &numero_de_membros);
  if(numero_de_membros < 1){
    return 0;
  }
  printf("Insira a quantidade de filiacoes: ");
  scanf("%i", &numero_de_filiacoes);
  
  node * arvore = inicializa_arvore(1);
  for(i = 2; i<= numero_de_membros; i++){
    criar_novo_no(i);
  }
  for(i = 0; i< numero_de_filiacoes; i++){
    scanf("%i %i", &pai,  &filho);
    insere(arvore, filho, pai);
    filho = 0;
    pai = 0;
  } 


  //printf("%p\n", busca_Chaves(1, arvore));
  //printf("%d %p %p %p\n", arvore->chave, arvore, arvore->primeiro_filho, arvore->proxIrmao);

  exibirArvore(arvore);
  
  return 0;
}
  

Uma entrada exemplo seria:

4 3
1 2
1 3
2 4

E a saída seria:

(1(2(4))(3))