3 4
Alm disso, o S.O. reserva Globais e Estticas termina, liberado. Globais e Estticas
os espaos necessrios para
A memria no ocupada pela
armazenar as variveis Memria Alocada pilha de execuo pode ser Memria Alocada
globais (e estticas) do
Memria Livre
1
Alocao da Memria Principal Funes para Alocar e Liberar memria
Exemplos: Funo bsica para alocar memria malloc()
Cdigo que aloca 1000 bytes de memria livre: int *vet;
char *p; vet = malloc(10*4);
p = malloc(1000);
Aps estes comandos, se a alocao for bem sucedida, vet
armazenar o endereo inicial de uma rea contnua de
Cdigo que aloca espao para 50 inteiros: memria suficiente para armazenar 10 valores inteiros.
int *p;
p = malloc(50*sizeof(int));
Desta forma, consideramos que um inteiro ocupa 4 bytes.
Para ficarmos independentes de compiladores e mquinas,
Obs.: O operador sizeof() retorna o nmero de bytes de usamos o operador sizeof( )
um inteiro. v = malloc(10*sizeof(int));
7 8
Funes para Alocar e Liberar memria Funes para Alocar e Liberar memria
A funo malloc usada para alocar espao para Se no houver espao livre suficiente para realizar a alocao, a
armazenarmos valores de qualquer tipo. Por este funo retorna um endereo nulo (representado pelo smbolo
motivo, malloc retorna um ponteiro genrico, para um NULL, definido em stdlib.h).
tipo qualquer, representado por void* , que pode ser
convertido automaticamente pela linguagem para o Podemos tratar o erro na alocao do programa simplesmente
tipo apropriado na atribuio. verificando o valor de retorno da funo malloc
Ex: imprimindo mensagem e abortando o programa com a funo
No entanto, comum fazermos a converso exit, tambm definida na stdlib.
explicitamente, utilizando o operador de molde de tipo v = (int*) malloc(10*sizeof(int));
(cast). if (v == NULL) {
printf("Memoria insuficiente.\n");
Ento: exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
v = (int *) malloc(10*sizeof(int)); }
9 10
11 12
2
Alocao Dinmica de Memria
O ponteiro retornado por tanto pela funo malloc
quanto pela calloc devem ser convertido para o tipo de
ponteiro que invoca a funo
int *pi = (int *) malloc (n*sizeof(int));
/* aloca espao para um inteiro */
int *ai = (int *) calloc (n, sizeof(int));
/* aloca espao para um array de n inteiros */
Alocao Dinmica
toda memria no mais utilizada deve ser liberada
atravs da funo free(): VETORES E MATRIZES
free(ai); /* libera todo o array */
free(pi); /* libera o inteiro alocado */
13 14
15 16
17 18
3
Vetores e alocao dinmica Alocao dinmica de matrizes
#include <stdio.h>
#include <stdlib.h> A alocao dinmica de memria para
int main () {
int *v, n, i;
matrizes realizada da mesma forma que para
printf("Qual o tamanho do vetor que deseja:");
scanf("%d", &n);
vetores, com a diferena que teremos um
v = (int *) calloc(n, sizeof(int)); /* aloca um vetor de n posies inteiras */ ponteiro apontando para outro ponteiro que
for (i =0; i<n; i++) {
printf(Informe o %d elemento: ", i+1); aponta para o valor final, o que denominado
scanf("%d", &v[i]); /* armazena o valor no vetor na posio i */
} indireo mltipla.
for (i =0; i<n; i++)
printf("%d ", v[i]); A indireo mltipla pode ser levada a qualquer
free(n); /* libera a memria alocada para o vetor */ dimenso desejada.
return 0;
}
19 20
21 22
23 24
4
Exerccios Exerccios
1) Escreva um programa em linguagem C que 2) Desenvolva um programa que calcule a soma
solicita ao usurio a quantidade de alunos de de duas matrizes MxN de nmeros reais
uma turma e aloca um vetor de notas
(nmeros reais). Depois de ler as notas, (double). A implementao deste programa
imprime a mdia aritmtica. deve considerar as dimenses fornecida pelo
Obs: no deve ocorrer desperdcio de usurio (Dica: represente a matriz atravs de
memria; e aps ser utilizada a memria variveis do tipo double **, usando alocao
deve ser devolvida. dinmica de memria)..