Boa tarde! Estou com certas dificuldades em se trabalhar com Pilha, ponteiros e alocação dinâmica:  A lógica do programa é receber sequencia de padrões e depois a sequencia final, e contar quantas vezes a sequencia de padrões foram encontradas em sequencia final.  Ao debugar este código, na função push o programa trava inesperadamente, a lógica dos restantes do programa não está completa, pois não consigo debugar p/ dar a continuidade... o que tem de errado no código galera? Sou iniciante aqui no forum e qualquer ajuda é bem-vinda! Obrigado.    #include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct pilha{
   char *valor;
    int t;
};
typedef struct pilha * Pilha;
int comparaPadrao (const void* a, const void* b){
    Pilha a1 = (Pilha*)a;
    Pilha b1 = (Pilha*)b;
    return strcmp(a1->valor, b1->valor);
}
void push (Pilha p, char *e){
    p->valor[(p->t)++] = e;
}
char pop (Pilha p){
    return p->valor[--(p->t)];
}
char topo(Pilha p){
    return p->valor[(p->t - 1)];
}
void destroiPilha(Pilha p){
    free(p);
}
Pilha novaPilha(){
    Pilha p;
    //p = malloc (sizeof (struct pilha));
    p = malloc (sizeof (Pilha));
    if (p == NULL){
        printf ("Algum erro ocorreu !\n");
        exit (-1);
    }
    p->t = 0;
    return p;
}
void detectaPadrao(Pilha p, char *vet, int qtd){
    int cont = 0;
    char* padFinal;
    char* pad;
    char espaco = ' ';
    padFinal = malloc(sizeof(char) * 1000);
    for(cont = 0; cont < qtd; cont++){
        *pad = pop(p);
        strcat(padFinal, pad);
        for(cont=0; vet[cont] != ''; cont++){
            if(*pad == vet[cont]){
                strcat(*padFinal, espaco);
                strcat(*padFinal,cont);
            }
        }
    }
    printf("%s", pad);
}
int main()
{
    int qtd = 0, cont = 0, tamanho = 0, qtdTotal = 0;
    char *padrão;
    Pilha p = novaPilha();
    printf("\nEntre com quantidade de padrão: ");
    scanf("%d", &qtd);
    fflush(stdin);
    for(cont = 0; cont < qtd; cont++){
        printf("\nEntre com o tamanho do %d padrão:", cont+1);
        scanf("%d", &tamanho);
        fflush(stdin);
        qtdTotal += tamanho;
        padrão = malloc(sizeof(char)*tamanho);
        if(padrão == NULL){
            printf("\nERRO!");
            exit(-1);
        }
        printf("\nEntre com o %d padrão:", cont+1);
        gets(padrão);
        push(p, padrão);
    }
    //qtdTotal +=
    printf("\nEntre com o tamanho da sequencia:");
    scanf("%d", &tamanho);
    fflush(stdin);
    printf("\nEntre com a sequencia:", cont+1);
    gets(padrão);
    qsort(p, qtd, sizeof(Pilha), comparaPadrao);
    detectaPadrao(p, padrão, qtd);
    return 0;
}