DinamicaA alocacao dinamica permite ao programador alocar memoria para variaveis quando oprograma esta sendo executado. Assim, poderemos definir, por exemplo, um vetor ou uma92matriz cujo tamanho descobriremos em tempo de execucao. O padrao C ANSI define apenas 4funcoes para o sistema de alocacao dinamica, disponiveis na biblioteca stdlib.h:No entanto, existem diversas outras funcoes que sao amplamente utilizadas, masdependentes do ambiente e compilador. Neste curso serao abordadas somente estas funcoespadronizadas.mallocA funcao malloc() serve para alocar memoria e tem o seguinte prototipo:void *malloc (unsigned int num);A funcao toma o numero de bytes que queremos alocar (num), aloca na memoria eretorna um ponteiro void * para o primeiro byte alocado. O ponteiro void * pode ser atribuidoa qualquer tipo de ponteiro. Se nao houver memoria suficiente para alocar a memoriarequisitada a funcao malloc() retorna um ponteiro nulo. Veja um exemplo de alocacaodinamica com malloc():#include <stdio.h>#include <stdlib.h> /* Para usar malloc() */main (void){int *p;int a;int i;... /* Determina o valor de a em algum lugar */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;...return 0;}No exemplo acima, e alocada memoria suficiente para se armazenar a numeros inteiros.O operador sizeof() retorna o numero de bytes de um inteiro. Ele e util para se saber otamanho de tipos. O ponteiro void* que malloc() retorna e convertido para um int* pelo caste e atribuido a p. A declaracao seguinte testa se a operacao foi bem sucedida. Se nao tiversido, p tera um valor nulo, o que fara com que !p retorne verdadeiro. Se a operacao tiver sido93bem sucedida, podemos usar o vetor de inteiros alocados normalmente, por exemplo,indexando-o de p[0] a p[(a-1)].callocA funcao calloc() tambem serve para alocar memoria, mas possui um prototipo umpouco diferente:void *calloc (unsigned int num, unsigned int size);A funcao aloca uma quantidade de memoria igual a num * size, isto e, aloca memoriasuficiente para um vetor de num objetos de tamanho size. Retorna um ponteiro void * para oprimeiro byte alocado. O ponteiro void * pode ser atribuido a qualquer tipo de ponteiro. Senao houver memoria suficiente para alocar a memoria requisitada a funcao calloc() retornaum ponteiro nulo. Veja um exemplo de alocacao dinamica com calloc():#include <stdio.h>#include <stdlib.h> /* Para usar calloc() */main (void){int *p;int a;int i;... /* Determina o valor de a em algum lugar */p=(int *)calloc(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;...return 0;}No exemplo acima, e alocada memoria suficiente para se colocar a numeros inteiros. Ooperador sizeof() retorna o numero de bytes de um inteiro. Ele e util para se saber o tamanhode tipos. O ponteiro void * que calloc() retorna e convertido para um int * pelo cast e eatribuido a p. A declaracao seguinte testa se a operacao foi bem sucedida. Se nao tiver sido, ptera um valor nulo, o