que fara com que !p retorne verdadeiro. Se a operacao tiver sido bem94sucedida, podemos usar o vetor de inteiros alocados normalmente, por exemplo, indexando-ode p[0] a p[(a-1)].reallocA funcao realloc() serve para realocar memoria e tem o seguinte prototipo:void *realloc (void *ptr, unsigned int num);A funcao modifica o tamanho da memoria previamente alocada apontada por *ptr paraaquele especificado por num. O valor de num pode ser maior ou menor que o original. Umponteiro para o bloco e devolvido porque realloc() pode precisar mover o bloco para aumentarseu tamanho. Se isso ocorrer, o conteudo do bloco antigo e copiado no novo bloco, e nenhumainformacao e perdida. Se ptr for nulo, aloca size bytes e devolve um ponteiro; se size e zero,a memoria apontada por ptr e liberada. Se nao houver memoria suficiente para a alocacao, umponteiro nulo e devolvido e o bloco original e deixado inalterado.#include <stdio.h>#include <stdlib.h> /* Para usar malloc() e realloc*/main (void){int *p;int a;int i;... /* Determina o valor de a em algum lugar */a = 30;p=(int *)malloc(a*sizeof(int)); /* Aloca a numeros inteirosp pode agora ser tratado como umvetor coma posicoes */if (!p){printf ("** Erro: Memoria Insuficiente **");exit;}for (i=0; i<a ; i++) /* p pode ser tratado como um vetor com aposicoes */p[i] = i*i;/* O tamanho de p deve ser modificado, por algum motivo ... */a = 100;p = realloc (p, a*sizeof(int));for (i=0; i<a ; i++) /* p pode ser tratado como um vetor com aposicoes */p[i] = a*i*(i-6);...95return 0;}freeQuando alocamos memoria dinamicamente e necessario que nos a liberemos quando elanao for mais necessaria. Para isto existe a funcao free() cujo prototipo e:void free (void *p);Basta entao passar para free() o ponteiro que aponta para o inicio da memoria alocada.Mas voce pode se perguntar: como e que o programa vai saber quantos bytes devem serliberados? Ele sabe pois quando voce alocou a memoria, ele guardou o numero de bytesalocados numa "tabela de alocacao" interna. Vamos reescrever o exemplo usado para a funcaomalloc() usando o free() tambem agora:#include <stdio.h>#include <stdlib.h> /* Para usar malloc e free */main (void){int *p;int a;...p=(int *)malloc(a*sizeof(int));if (!p){printf ("** Erro: Memoria Insuficiente **");exit;}...free(p);...return 0;}AUTO AVALIACAOVeja como voce esta. Refaca os exemplos desta pagina, mas ao inves de trabalhar comum vetor de inteiros, use um vetor de strings (ou uma matriz de char, como voce preferir).Faca leituras e apresente os resultados na tela.96Alocacao Dinamica de Vetores e MatrizesAlocacao Dinamica de VetoresA alocacao dinamica de vetores utiliza os conceitos aprendidos na aula sobre ponteiros eas funcoes de alocacao dinamica apresentados. Um exemplo de implementacao para vetor reale fornecido a seguir:#include <stdio.h>#include <stdlib.h>float *Alocar_vetor_real (int n){float *v; /* ponteiro para o vetor */if (n < 1) { /* verifica parametros recebidos */printf ("** Erro: Parametro invalido **\n");return (NULL);}/* aloca o vetor */v = (float *) calloc (n, sizeof(float));if (v == NULL) {printf ("** Erro: Memoria Insuficiente **");return (NULL);}return (v); /* retorna o ponteiro para o vetor */}float *Liberar_vetor_real (float *v){if (v == NULL) return (NULL);free(v); /* libera o vetor */return (NULL); /* retorna o ponteiro */}void main (void){float *p;int a;... /* outros comandos, inclusive a inicializacao de a */p =