curriculo.obrigatorias=(char
**)malloc(curriculo.obrig*sizeof(char *));
curriculo.optativas=(char
**)malloc(curriculo.optat*sizeof(char *));
fscanf(ccl,"%s", curriculo.obrigatorias[i]);
Nos dois primeiros casos você está alocando um vetor de pointers para char,
por isso o * dentro do sizeof. Na 3a. linha, você está lendo uma string, logo
não deve usar o &.
Espero ter ajudado,
Daniel