Apostila C da UFMG - Universidade do Minho
Apostila C da UFMG - Universidade do Minho
Apostila C da UFMG - Universidade do Minho
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
void PrintString (char *str,int (*func)())<br />
{<br />
(*func)(str);<br />
}<br />
No programa acima, a função PrintString() usa uma função qualquer func para imprimir a string na tela. O<br />
programa<strong>do</strong>r pode então fornecer não só a string mas também a função que será usa<strong>da</strong> para imprimí-la. No main()<br />
vemos como podemos atribuir, ao ponteiro para funções p, o endereço <strong>da</strong> função puts() <strong>do</strong> C.<br />
10.6 - Alocação Dinâmica<br />
A alocação dinâmica permite ao programa<strong>do</strong>r criar variáveis em tempo de execução, ou seja, alocar memória para<br />
novas variáveis quan<strong>do</strong> o programa está sen<strong>do</strong> executa<strong>do</strong>. Esta é outra ferramenta que nos mostra o poder <strong>do</strong> C. O<br />
padrão C ANSI define apenas 4 funções para o sistema de alocação dinâmica, disponíveis na biblioteca stdlib.h:<br />
No entanto, existem diversas outras funções que são amplamente utiliza<strong>da</strong>s, mas dependentes <strong>do</strong> ambiente e<br />
compila<strong>do</strong>r. Neste curso serão abor<strong>da</strong><strong>da</strong>s somente estas funções básicas. Consulte o manual de seu compila<strong>do</strong>r para<br />
saber mais sobre as funções disponíveis para alocação dinâmica.<br />
10.6.1 - malloc<br />
A função malloc() serve para alocar memória e tem o seguinte protótipo:<br />
void *malloc (unsigned int num);<br />
A funçao toma o número de bytes que queremos alocar ( num), aloca na memória e retorna um ponteiro void * para o<br />
primeiro byte aloca<strong>do</strong>. O ponteiro void * pode ser atribuí<strong>do</strong> a qualquer tipo de ponteiro. Se não houver memória<br />
suficiente para alocar a memória requisita<strong>da</strong> a função malloc() retorna um ponteiro nulo. Veja um exemplo de<br />
alocação dinâmica com malloc():<br />
#include <br />
#include <br />
main (void)<br />
{<br />
int *p;<br />
int a;<br />
... /* Determina o valor de a em algum lugar */<br />
p=(int *)malloc(a*sizeof(int));<br />
if (!p)<br />
{<br />
printf ("** Erro: Memoria Insuficiente **");<br />
exit;<br />
}<br />
...<br />
return 0;<br />
}<br />
No exemplo acima, é aloca<strong>da</strong> memória suficiente para se colocar a números inteiros. O opera<strong>do</strong>r sizeof() retorna o<br />
número de bytes de um inteiro. Ele é util para se saber o tamanho de tipos. O ponteiro void* que malloc() retorna é<br />
converti<strong>do</strong> para um int* pelo cast e é atribuí<strong>do</strong> a p. A declaração seguinte testa se a operação foi bem sucedi<strong>da</strong>. Se<br />
não tiver si<strong>do</strong>, p terá um valor nulo, o que fará com que !p retorne ver<strong>da</strong>deiro. Se a operação tiver si<strong>do</strong> bem sucedi<strong>da</strong>,<br />
podemos usar o vetor de inteiros aloca<strong>do</strong>s normalmente, por exemplo, indexan<strong>do</strong>-o de p[0] a p[(a-1)].<br />
10.6.2 - calloc<br />
A função calloc() também serve para alocar memória, mas possui um protótipo um pouco diferente:<br />
void *calloc (unsigned int num, unsigned int size);<br />
A funçao aloca uma quanti<strong>da</strong>de de memória igual a num * size , isto é, aloca memória suficiente para uma matriz de<br />
num objetos de tamanho size . Retorna um ponteiro void * para o primeiro byte aloca<strong>do</strong>. O ponteiro void * pode ser<br />
atribuí<strong>do</strong> a qualquer tipo de ponteiro. Se não houver memória suficiente para alocar a memória requisita<strong>da</strong> a função<br />
calloc() retorna um ponteiro nulo. Veja um exemplo de alocação dinâmica com calloc():<br />
#include <br />
#include <br />
main (void)<br />
{<br />
int *p;<br />
int a;<br />
Pág. 72