Realocando dinâmicamente a memória no C

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.