Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf ·...

23
T. 11 – Gestão de Memória Dinâmica 1 Programação Introdução à Programação

Transcript of Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf ·...

Page 1: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

T. 11 – Gestão de Memória Dinâmica

1

ProgramaçãoIntrodução à Programação

Page 2: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

T11 Gestão de Memória Dinâmica

Sumário

…:

– Utilização de memória

– Alocação Estática de Memória

– Alocação Dinâmica de Memória

– Funções de Alocação de Memória

– Libertação de Memória (free)

2

Page 3: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

Alocação de Memória

A linguagem C permite duas formas de reservar memória para qualquer objeto

(por exemplo, inteiros, estruturas, arrays, etc.):

• Alocação estática de memória. Até agora, a reserva or alocação de memória

era feita em tempo de compilação através de declaração de variáveis.

• Alocação dinâmica de memória. A alocação dinâmica de memória é utilizada

para reservar or libertar memória durante a execução do programa.

As funções de alocação dinâmica de memória exigem a inclusão do ficheiro stdlib.hT11 Gestão de Memória Dinâmica

3

Page 4: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

Organização Conceptual da Memória

T11 Gestão de Memória Dinâmica

4

Page 5: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

Computer Science: A Structured Programming Approach Using C

T11 Gestão de Memória Dinâmica

5

Page 6: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

Acesso à Memória Dinâmica

T11 Gestão de Memória Dinâmica

6

Page 7: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

Funções de Gestão de Memória

T11 Gestão de Memória Dinâmica

7

Page 8: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

T11 Gestão de Memória Dinâmica

8

Page 9: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

malloc

T11 Gestão de Memória Dinâmica

9

Page 10: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

malloc

Para reservar memória, utiliza-se a seguinte função:

void *malloc(size_t size);

• size representa o nº de bytes a serem reservados.

• Utiliza-se sizeof para determinar o tamanho (em bytes) do tipo de dados.

• Retorna um ponteiro void*, o qual pode ser atribuído a qualquer ponteiro.

• Se não houver memória disponível, a função malloc devolve o valorNULL.

Exemplo:

char *line;

int linelength = 100;

line = (char*)malloc(linelength);

T11 Gestão de Memória Dinâmica

10

Page 11: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

malloc() example

Para reservar espaço em memória para 100 inteiros:

int *ip;

if ((ip = (int*)malloc(100 * sizeof(int))) == NULL){

printf("out of memory\n");

exit();

}

• Note-se o cast do valor devolvido para int*.

• Note que estamos a verificar se a função devolve NULL ou não.

T11 Gestão de Memória Dinâmica

11

Page 12: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

malloc() outro exemplo

#include <stdio.h>

#include <stdlib.h>

int main ()

{

char *str;

/* Initial memory allocation */

str = (char *) malloc(15);

strcpy(str, "tutorialspoint");

printf("String = %s, Address = %u\n", str, str);

/* Reallocating memory */

str = (char *) realloc(str, 25);

strcat(str, ".com");

printf("String = %s, Address = %u\n", str, str);

free(str);

return(0);

}

T11 Gestão de Memória Dinâmica

12

Page 13: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

calloc

T11 Gestão de Memória Dinâmica

13

Page 14: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

calloc

É semelhante ao malloc. A diferença é que os seus elementos são inicializados a zero.

void *calloc(size_t nitem, size_t size);

em que:

• nitem representa o nº de elementos do tipo de dados definido por size.

• size representa o nº de bytes do tipo de dados a ser utilizado; utiliza-se sizeof

para determinar o tamanho (em bytes) do tipo de dados.

T11 Gestão de Memória Dinâmica

14

Page 15: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

calloc() example

/* Using calloc() to initialize 100 floats to 0.0 */

#include <stdlib.h>

#include <stdio.h>

#define BUFFER_SIZE 100

int main(){

float * buffer;

int i;

if ((buffer = (float*)calloc(BUFFER_SIZE, sizeof(float))) == NULL){

printf("out of memory\n");

exit(1);

}

for (i=0; i < BUFFER_SIZE; i++)

printf(“buffer[%d] = %f\n”, i, buffer[i]);

return 0;

}

T11 Gestão de Memória Dinâmica

15

Page 16: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

realloc

T11 Gestão de Memória Dinâmica

16

Page 17: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

realloc

Permite redefinir o tamanho da memória previamente reservada.

Exemplo:

int *ip;

ip = (int*)malloc(100 * sizeof(int));

...

/* need twice as much space */

ip = (int*)realloc(ip, 200 * sizeof(int));

T11 Gestão de Memória Dinâmica

17

Page 18: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

free

T11 Gestão de Memória Dinâmica

18

Page 19: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

T11 Gestão de Memória Dinâmica

19

Page 20: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

Computer Science: A Structured Programming Approach Using C

T11 Gestão de Memória Dinâmica

20

Page 21: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

Array of pointers

int tabela[5][7];

A utilização de um array estático com um número variável de elementos dá origem a desperdício de memória.

T11 Gestão de Memória Dinâmica

21

Page 22: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

Array of pointers (cont.)

Esta estrutura de dados é particularmente útil quando o número de elmentos de um array é variável.T11 Gestão de Memória Dinâmica

22

Page 23: Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf · Alocação de Memória A linguagem C permite duas formas de reservar memória para qualquer

Conclusão

…:

– Utilização de memória

– Alocação estática de memória

– Alocação dinâmica de memória

– Funções de alocação de memória

– Libertação de memória(free)

– Array de ponteiros

T11 Gestão de Memória Dinâmica