14.03.2015 Views

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!