algo10 ansi c gerenciamentodememoria -...

34
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE Algoritmos ANSI C - Gerenciamento de Memória Copyright © 2014 IFRN

Upload: lamcong

Post on 19-Sep-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

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

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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/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

/20

Dúvidas?20