Para o uso da função realloc do ANSI C algum cuidado é necessário, primeiramente a dica de http://www.vivaolinux.com.br/dica/Usando-o-realloc é muito boa.
A função deve ser chamada como o valor para um ponteiro e passada como parâmetro para que os endereços de memória fiquem todos bem organizados. Isso vale se você for implementar uma função que insere um elemento numa pilha também, isto é, o que se espera da sintaxe correta para o realloc deve se esperar da sua nova função:
void *inserir(int x, int *P, int *tam) { P=(int *)realloc(P,(*tam+1)*sizeof(int)); P[*tam]=x; *tam=*tam+1; }
Essa função irá colocar o inteiro x na pilha P, previamente alocada com o espaço para um inteiro no mínimo, porém a posição da memória do ponteiro P ficará bagunçada, logo o correto será:
int *inserir(int x, int *P, int *tam) { P=(int *)realloc(P,(*tam+1)*sizeof(int)); P[*tam]=x; *tam=*tam+1; return P; }
Agora quando for inserir um inteiro num trecho do seu programa basta fazer:
Q=inserir(3,Q,&tam_Q);
e a memória RAM é o limite.