E ae Pessoal Conectado na Imp Games, estou aqui novamente trazendo um conteúdo novo " Alocação Dinâmica de Memória ". Nesse tuto algumas Funções ainda não foram vistas, explicarei o funcionamento de cada uma e para que servem.

Alocação Dinâmica: A alocação dinâmica permite ao programador criar variáveis em tempo de execução, ou seja, alocar memória para novas variáveis quando o programa está sendo executado, proporcionando uma melhor utilização da memória da máquina, pois quando criada em tempo de execução não é necessária a utilização de memória adicional.

Código:
#include <stdio.h>
#include <stdlib.h>

int main (void)
{ // Iniciando Bloco ou Programa

   system("cls"); // Comando usado para apagar a Tela
   int *p; // Declarando Variavel que servirá como Ponteiro
   int i, k, n; // Declarando Demais Variavéis
   printf("\n Digite a quantidade de numeros que serao digitados : "); // Imprimindo instruções para quantidade de posições
   scanf("%d", &i);
   
   p = (int *)(malloc (i * sizeof(int))); // Atribuindo à "p" o tamanho de sua alocação que será valor contido em "i"
   
   if (p == NULL) // Prevenção de Erro na Alocação: Caso não haja espaço na memoria o valor continuará 0
   {
    printf("\nErro de alocacao de memoria"); // Imprimindo mensagem de erro
    exit(1); // Fechando o Programa
   }
   
  for(k = 0; k < i; k++) // Percorrendo os elementos do Vetor
   {
     printf("Informe o numero para o indice %d : ",k); // Imprimindo intruções para atribuição de valor aos elementos
     scanf("%d",&p[k]);
   }

   for(k = 0; k < i; k++) // Percorrendo os elementos do Vetor
   {
     printf("O numero para o indice %d, %d\n",k,p[k]); // Imprimindo os valores atribuidos à cada elemento
   }
   

   printf("\n Digite quantos elementos quer adicionar ao vetor : "); // Imprimindo instruções para quantidade de posições à serem acrescentadas na realocação
   scanf("%d",&n);
   
   p = (int *)(realloc(p, (i + n )* sizeof(int))); // Atribuindo à "p" o novo tamanho de sua alocação que será valor contido em "i" Tamanho Original + "n" Quantidade à ser acrescentada
   
   if (p == NULL) // Prevenção de Erro na Alocação: Caso não haja espaço na memoria o valor continuará 0
   {
    printf("\nErro de alocacao de momoria"); // Imprimindo mensagem de erro
    exit(1); // Fechando o Programa
   }
   
   for(k = 0; k < i+n; k++) // Percorrendo os elementos do Vetor Realocado
   {
     printf("Digite o numero para o indice %d: ",k); // Imprimindo intruções para atribuição de valor aos elementos
     scanf("%d",&p[k]);
   }

   for(k = 0; k < i+n; k++) // Percorrendo os elementos do Vetor Realocado
   {
     printf("O numero para o indice %d, %d\n",k,p[k]); // Imprimindo os valores atribuidos à cada elemento
   }

   free(p); // Liberando espaço de memoria utilizado pelo elemento "p"

   printf("\n"); // Acrescentando um espaço para organização do programa
   system("pause"); // Dando pause no programa para que mostre os resultados do programa até o usuario pressionar alguma tecla

} // Fechando Bloco ou Programa
Breve Explicação:

A função malloc() serve para alocar memória, ou seja, reserva um numero especifico de memoria, dependendo do tipo do ponteiro que chama a função.
A função realloc() é utilizada para realocar memória.
Quando alocamos memória dinamicamente é recomendado que ao término da execução do programa essa memória seja liberada. Para isto existe a função free().


Informação
Créditos pelo Tutorial : Sup_Anjo e João Neto