Bom dia pessoa ! 
Sou novo no fórum, acabei de me registrar e gostaria de pedir uma ajuda a vocês, pesquisei no fórum e não encontrei.  
Preciso inserir valores em uma lista encadeada, mas está dando erro quando chega nas matrizes. O Código é um pouco grande, mas nem está terminado, buguei nessa parte e não encontro o erro. 
O erro acontece no procedimento inserir fim. 
  
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
struct cadastro
{
    //Dados cadastrais do colega
     char nome[50];
     char endereco[100];
     char cidade[50];
     char estado[30];
     char idade[10];
     char tresidencial[12];
     char tcelular[12];
     char email[30];
     //Dados cadastrais do filho
     int qtdfilhos;
     char fnome[10][50];
     char fnacionalidade[10][15];
     char fidade[10][10];
     char fsexo[10][15];
     struct cadastro *prox;
};
typedef struct cadastro cad;
 
 
void inserirFim(cad **paramcad, char parnome[], char parendereco[], char parcidade[], char parestado[], char paridade[], char partresidencial[], char partcelular[], char paremail[], int parqtdfilhos, char parfnome[][50], char parfnacionalidade[], char parfidade[], char parfsexo[])
{
     cad *ncad;//criando ponteiro nova lista.
     ncad=(cad*)malloc(sizeof(cad));//alocando o espaço em memória
     strcpy(ncad->nome, parnome);
     strcpy(ncad->endereco, parendereco);
strcpy(ncad->cidade, parcidade);
strcpy(ncad->estado, parestado);
strcpy(ncad->idade, paridade);
strcpy(ncad->tresidencial, partresidencial);
strcpy(ncad->tcelular, partcelular);
strcpy(ncad->email, paremail);
ncad->qtdfilhos = parqtdfilhos;
strcpy(ncad->fnome, parfnome);
strcpy(ncad->fnacionalidade, parfnacionalidade);
strcpy(ncad->fidade, parfidade);
strcpy(ncad->fsexo, parfsexo);
ncad->proximo = NULL;
     if(*paramcad == NULL)
{
  *paramcad = ncad;//se for insere a nova lista no final
     }
else
{
        cad *cadaux;
     cadaux = *paramcad; //coloca a lista atual na lista auxiliar
        while(cadaux->proximo != NULL)
{ //e vai percorrendo a lista ate encontrar o final ou seja NULL
            cadaux = cadaux->proximo; //enquato não acha o final ela fica colocando "as estruturas listas" na lista temporaria
        }//obviamente uma ora ela vai chegar no final da lista ou seja nesta linha
        cadaux->proximo = ncad;//como ele já esta no final da fila ele so adiciona a nova lista
    }
}
 
 
 
void recebe(cad **paramcad)
{
int x;
printf("\nEste colega possui filho(s)?\n1 - Sim\n2 - não\n");
     scanf("%d", &x);
     if(x==1)
     {
        fflush(stdin);
      char nome[50];
      char endereco[100];
      char cidade[50];
      char estado[30];
      char idade[10];
      char tresidencial[12];
      char tcelular[12];
      char email[30];
      //Recebe os dados cadastrais do colega
      printf("\nDigite o nome: ");
      gets(nome);
    //  inserirFim(&cadastro,tmp);
      printf("Digite o endereco: ");
      gets(endereco);
      printf("Digite a cidade: ");
      gets(cidade);
      printf("Digite o estado: ");
      gets(estado);
      printf("Digite a idade: ");
      gets(idade);
      printf("Digite o telefone residencial: ");
      gets(tresidencial);
      printf("Digite o telefone celular: ");
      gets(tcelular);
      printf("Digite o email: ");
      gets(email);
      system("cls");
      int qtdfilhos;
        char fnome[10][50];
        char fnacionalidade[10][15];
        char fidade[10][10];
        char fsexo[10][15];
        system("cls");
        printf("\nDigite a quantidade de filhos: ");
        gets(qtdfilhos);
        fflush(stdin);
        int f;
        f=qtdfilhos;
 
        while(y != f)
        {
            printf("\nDigite os dados cadastrais do(s) filho(s)\n\n");
            printf("Digite o nome do %d filho: ", y+1);
            gets(fnome[y]);
            fflush(stdin);
            printf("Digite a nacionalidade: ");
            gets(fnacionalidade[y]);
            fflush(stdin);
            printf("Digite a idade: ");
            gets(fidade[y]);
            fflush(stdin);
            printf("Digite o sexo: ");
            gets(fsexo[y]);
            fflush(stdin);
            system("cls");
            y++;
        }
        inserirFim(paramcad,nome, endereco,cidade, etado, idade, tresidencial, tcellar, email, qtdfilhos, fnome, fnacionalidade, fidade, fsexo);
     }
     if(x==2)
     {
      fflush(stdin);
      char nome[50];
      char endereco[100];
      char cidade[50];
      char estado[30];
      char idade[10];
      char tresidencial[12];
      char tcelular[12];
      char email[30];
      //Recebe os dados cadastrais do colega
      printf("\nDigite o nome: ");
      gets(nome);
    //  inserirFim(&cadastro,tmp);
      printf("Digite o endereco: ");
      gets(endereco);
      printf("Digite a cidade: ");
      gets(cidade);
      printf("Digite o estado: ");
      gets(estado);
      printf("Digite a idade: ");
      gets(idade);
      printf("Digite o telefone residencial: ");
      gets(tresidencial);
      printf("Digite o telefone celular: ");
      gets(tcelular);
      printf("Digite o email: ");
      gets(email);
      system("cls");
      cidade cidade cidade
        inserirFim(paramcad,nome, endereco,cidade, etado, idade, tresidencial, tcellar, email);
 
}
if(x!= 1 && x!= 2)
{
printf("Opcao invalida!\n Escola uma opcao entre 1 e 2");
}
 
 
}
 
main()
{
  int op=0;
  int subop=0;
  cad *cadastro;
  cadastro=NULL;
 
  while(op!=6)
  {
    system("cls");
    printf("\nMenu Principal\n");
    printf("\n1 - Cadastrar um novo colega e/ou filho\n2 - Mostrar os colegas cadastrados\n3 - Excluir um colega e/ou filho\n4 - Localizar os dados de um colega\n5 - Salvar as informacoes em arquivo\n6 - Sair\n");
    printf("\n");
    scanf("%d",&op);
    switch (op)
    {
      case 1:
           system("cls");
           printf("\nMenu de Cadastramento\n\n1 - Cadastrar um colega\n2 - Cadastrar um filho\n\n");
           scanf("%d", & subop);
           system("cls");
           printf("\n");
           if(subop==1)
           {
               printf("\n");
               system("cls");
               printf("Preencha os dados cadastrais para seu colega:\n");
               recebe(&cadastro);
 
            }
           if (subop==2)
           {
                printf("\n");
                printf("Preencha os dados cadastrais para seu filhos:\n");
                system("pause>>null");//será removido quando todo o programa estiver concluido
           }
           if(subop != 1 && subop!=2)
           {
              printf("\n");
              printf("Opcao invalida\nSelecione 1 ou 2");
              system("pause>>null");//será removido quando todo o programa estiver concluido
           }
 
           break;
      case 2:
          system("cls");
 
           break;
      case 3:
           printf("Menu de Exclusao\n1 - Exlcuir um colega\n2 - Excluir um filho");
           scanf("%d", & subop);
           printf("\n");
           if(subop==1)
           {
 
           }
           if (subop==2)
           {
 
           }
           if(subop != 1 && subop!=2)
           {
 
           }
           break;
      case 4:
           break;
      case 5:
           break;
      case 6:
           op=6;
           break;
      default:
              printf("\nOpcao invalida!\nSelecione uma opcao de 1 a 6");
              system("pause>>null");
    }
  }
}