![Page 1: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/1.jpg)
INSTITUTO FEDERAL DEEDUCAÇÃO, CIÊNCIA E TECNOLOGIARIO GRANDE DO NORTE
AlgoritmosANSI C - Gerenciamento de Memória
Copyright © 2014 IFRN
![Page 2: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/2.jpg)
/20
AgendaIntrodução Alocação dinâmica Funções
malloc free calloc realloc
Exercícios
2
![Page 3: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/3.jpg)
/20
IntroduçãoQuando declaramos uma variável, um espaço de memória é reservado
Endereço fixo Através de ponteiros podemos indicar qual endereço usar
E se quisermos usar mais memória? Um endereço que não seja de uma variável definida no programa
3
20&a
a*p
p pode apontar para QUALQUER endereço
![Page 4: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/4.jpg)
/20
Introdução
4
0
2n-1
![Page 5: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/5.jpg)
/20
Introdução
4
0
2n-1
text Código do programa
![Page 6: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/6.jpg)
/20
Introdução
4
0
2n-1
textdata
Código do programaVariáveis globais inializadas
![Page 7: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/7.jpg)
/20
Introdução
4
0
2n-1
textdatabss
Código do programaVariáveis globais inializadasVariáveis globais não inicializadas
![Page 8: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/8.jpg)
/20
Introdução
4
0
2n-1
textdatabss
stack
Código do programaVariáveis globais inializadasVariáveis globais não inicializadas
Pilha de dados locais
![Page 9: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/9.jpg)
/20
Introdução
4
0
2n-1
textdatabss
heap
stack
Código do programaVariáveis globais inializadasVariáveis globais não inicializadasÁrea alocada dinamicamente
Pilha de dados locais
![Page 10: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/10.jpg)
/20
Introdução
4
0
2n-1
textdatabss
heap
stack
Código do programaVariáveis globais inializadasVariáveis globais não inicializadasÁrea alocada dinamicamente
Pilha de dados locais
![Page 11: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/11.jpg)
/20
Introdução
4
0
2n-1
textdatabss
heap
stack
Código do programaVariáveis globais inializadasVariáveis globais não inicializadasÁrea alocada dinamicamente
Pilha de dados locais
![Page 12: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/12.jpg)
/20
Alocação dinâmica
5
Porque? Tamanho “desconhecido” de um array Listas encadeadas (veremos mais a frente) Exemplo: Um programa que ordena números inteiros Quantidade de números a ordenar desconhecida
5 12 21 29 129 321 821 ... 2 123
0 1 2 3 4 5 6 nn-1
![Page 13: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/13.jpg)
/20
Alocação dinâmicaSolução 1 (sem alocação dinâmica)
Definir capacidade máxima do array
Problemas Limitamos, no programa, a quantidade de números que podemos ordenar SEMPRE usaremos a quantidade de memória definida pela capacidade máxima
6
#define N 10000000int numeros[N];
![Page 14: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/14.jpg)
/20
Funções de gerenciamentoGerenciamento de memória
Funções de alocação dinâmica O padrão ANSI C define 4 funções para gerenciamento de memória malloc: aloca memória calloc: aloca e inicia com zeros realloc: redimenciona tamanho de memória alocada free: libera espaço alocado
Biblioteca stdlib.h
7
#include <stdlib.h>
![Page 15: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/15.jpg)
/20
malloc - memory allocationFunção malloc:
Retorna um ponteiro para uma área de memória (void *)
NULL se não houver memória suficiente Devemos passar a quantidade de memória a ser alocada, em bytes Memória alocada na heap
8
void * malloc(size_t size);
![Page 16: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/16.jpg)
/20
malloc - memory allocation
9
int *numeros;int quantidade;numeros = (int*) malloc(sizeof(int) * quantidade);
Tamanho de um inteiro, em bytes
Quantidade a ser alocada
cast para o tipo que realmente
queremos
O espaço é alocado sequencialmente
![Page 17: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/17.jpg)
/20
Modelo da memória
10
int *numeros;int quantidade;numeros = (int*) malloc(sizeof(int) * quantidade);
sizeof(int)
{ { { { { {
1 2 3 4 n-1 nnumeros[0] numeros[1] numeros[2] numeros[3] numeros[n-2] numeros[n-1]
![Page 18: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/18.jpg)
/20
Exemplo
11
#include <stdio.h>#include <stdlib.h>
int main(int argc, char ** argv) { int *numeros, tamanho, i; scanf("%d",&tamanho); numeros = (int*) malloc(sizeof(int) * tamanho); if (numeros == NULL) { fprintf(stderr, "ERRO ao alocar memória\n"); exit(1); } for (i=0; i<tamanho; i++) scanf("%d",&numeros[i]); /*...*/
return 0; }
![Page 19: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/19.jpg)
/20
Exemplo
11
#include <stdio.h>#include <stdlib.h>
int main(int argc, char ** argv) { int *numeros, tamanho, i; scanf("%d",&tamanho); numeros = (int*) malloc(sizeof(int) * tamanho); if (numeros == NULL) { fprintf(stderr, "ERRO ao alocar memória\n"); exit(1); } for (i=0; i<tamanho; i++) scanf("%d",&numeros[i]); /*...*/
return 0; }
Biblioteca
![Page 20: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/20.jpg)
/20
Exemplo
11
#include <stdio.h>#include <stdlib.h>
int main(int argc, char ** argv) { int *numeros, tamanho, i; scanf("%d",&tamanho); numeros = (int*) malloc(sizeof(int) * tamanho); if (numeros == NULL) { fprintf(stderr, "ERRO ao alocar memória\n"); exit(1); } for (i=0; i<tamanho; i++) scanf("%d",&numeros[i]); /*...*/
return 0; }
Biblioteca
Alocação
![Page 21: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/21.jpg)
/20
Exemplo
11
#include <stdio.h>#include <stdlib.h>
int main(int argc, char ** argv) { int *numeros, tamanho, i; scanf("%d",&tamanho); numeros = (int*) malloc(sizeof(int) * tamanho); if (numeros == NULL) { fprintf(stderr, "ERRO ao alocar memória\n"); exit(1); } for (i=0; i<tamanho; i++) scanf("%d",&numeros[i]); /*...*/
return 0; }
Biblioteca
Alocação
Verifica se houve
alocação
![Page 22: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/22.jpg)
/20
Exemplo
11
#include <stdio.h>#include <stdlib.h>
int main(int argc, char ** argv) { int *numeros, tamanho, i; scanf("%d",&tamanho); numeros = (int*) malloc(sizeof(int) * tamanho); if (numeros == NULL) { fprintf(stderr, "ERRO ao alocar memória\n"); exit(1); } for (i=0; i<tamanho; i++) scanf("%d",&numeros[i]); /*...*/
return 0; }
Biblioteca
Alocação
Verifica se houve
alocação
Usa memória alocada
![Page 23: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/23.jpg)
/20
free - libera memóriaDepois que utilizarmos a memória alocada, devemos liberar
Este mesmo espaço fica disponível para novas alocações função free
12
void free(void *ptr);
Ponteiro para o início de uma área de memória previamente alocada (com malloc ou calloc)
![Page 24: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/24.jpg)
/20
free - libera memóriaIMPORTANTE
Liberar após uso Não usar área liberada Não usar área fora da área alocada
13
![Page 25: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/25.jpg)
/20
Exemplo
14
int main(int argc, char ** argv) {int *numeros, tamanho, i;
scanf("%d",&tamanho);numeros = (int*) malloc(sizeof(int) * tamanho); if (numeros == NULL) { fprintf(stderr, "ERRO ao alocar memória\n"); exit(1); }
for (i=0; i<tamanho; i++) scanf("%d",&numeros[i]); /*...*/ free(numeros);return 0;
}
![Page 26: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/26.jpg)
/20
Exemplo
14
int main(int argc, char ** argv) {int *numeros, tamanho, i;
scanf("%d",&tamanho);numeros = (int*) malloc(sizeof(int) * tamanho); if (numeros == NULL) { fprintf(stderr, "ERRO ao alocar memória\n"); exit(1); }
for (i=0; i<tamanho; i++) scanf("%d",&numeros[i]); /*...*/ free(numeros);return 0;
}
![Page 27: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/27.jpg)
/20
Mais alocaçãoFunção calloc
Mesma função do malloc Coloca zeros (0) em toda a área alocada Após seu uso também devemos liberar área
Dois parâmeros Quanto elementos deseja alocar O tamanho, em bytes, de cada elemento
15
void * calloc(size_t count, size_t size);
![Page 28: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/28.jpg)
/20
RealocaçãoRedimensiona uma área de memória para um novo tamanho
O retorno de realloc é um ponteiro para a área redimensionada. Nova área pode começar em endereço diferente do original
16
void * realloc(void *ptr, size_t size);
![Page 29: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/29.jpg)
/20
Retorno de função
17
int *impares(int *a,int tamanho, int *qtdImpares){ int i,j,qtdI; int *impares; qtdI = 0; for (i = 0 ; i < tamanho ; i++) if (a[i]%2==1) qtdI++; impares=(int*)malloc(sizeof(int)*qtdI); j=0; for (i = 0 ; i < tamanho ; i++) if (a[i]%2==1) impares[j++]=a[i]; *qtdImpares = qtdI; return impares; }
Ponteiro para uma área de memória
Alocaçao da área de memória
![Page 30: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/30.jpg)
/20
int main(int argc, char ** argv) {int *numeros,*imp,qtdI, tamanho, i;
scanf("%d",&tamanho); numeros = (int*) malloc(sizeof(int) * tamanho); for (i=0; i<tamanho; i++) scanf("%d",&numeros[i]); imp = impares(numeros,tamanho,&qtdI); free(numeros); free(imp);
return 0; }
Retorno de função
17
int *impares(int *a,int tamanho, int *qtdImpares){ int i,j,qtdI; int *impares; qtdI = 0; for (i = 0 ; i < tamanho ; i++) if (a[i]%2==1) qtdI++; impares=(int*)malloc(sizeof(int)*qtdI); j=0; for (i = 0 ; i < tamanho ; i++) if (a[i]%2==1) impares[j++]=a[i]; *qtdImpares = qtdI; return impares; }
Ponteiro para uma área de memória
Alocaçao da área de memória
![Page 31: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/31.jpg)
/20
ExemploOtimizar área usada por uma string
18
char * removeAreaNaoUsada(char *s){ char *nova,*origem,*destino; nova=(char*)malloc(sizeof(char)*(strlen(s)+1)); origem=s; destino=nova; while (*origem!='\0') { *destino=*origem; destino++; origem++; } *destino=*origem; return nova;}
![Page 32: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/32.jpg)
/20
ExemploOtimizar área usada por uma string
18
char * removeAreaNaoUsada(char *s){ char *nova,*origem,*destino; nova=(char*)malloc(sizeof(char)*(strlen(s)+1)); origem=s; destino=nova; while (*origem!='\0') { *destino=*origem; destino++; origem++; } *destino=*origem; return nova;}
int main(int argc, char ** argv) { char *s,*aux; /*...*/ aux=s; s=removeAreaNaoUsada(s); free(aux); /*...*/ return 0; }
![Page 33: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/33.jpg)
/20
ConclusãoAlocação dinâmica de memória é uma ferramenta poderosa para desenvolver programas em ANSI C Deve ser usada com cuidado
Não perder referências a áreas de memórias alocadas Liberar memória que não é mais usada
19
![Page 34: algo10 ANSI C GerenciamentoDeMemoria - …docente.ifrn.edu.br/.../algo10_ANSI_C_GerenciamentoDeMemoria.pdf · int numeros[N]; /20 ... poderosa para desenvolver programas em ANSI C](https://reader033.vdocuments.net/reader033/viewer/2022051602/5ba19c3709d3f2716b8cc1d0/html5/thumbnails/34.jpg)
/20
Dúvidas?20