programação - ubiagomes/programacao/teoricas/13-memoria.pdf · programação engenharia...

23
Programação Engenharia Informática (11543) – 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) – 1º ano, 1º semestre Cap. 13 – Gestão de Memória Dinâmica

Upload: trinhkhanh

Post on 17-Dec-2018

231 views

Category:

Documents


0 download

TRANSCRIPT

ProgramaçãoEngenharia Informática (11543) – 1º ano, 1º semestre

Tecnologias e Sistemas de Informação (6619) – 1º ano, 1º semestre

Cap. 13 – Gestão de Memória Dinâmica

T13 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)

Based on:https://users.cs.fiu.edu/~crahn/COP4338/PowerPoints/Chap-10-2.pptandwww.cs.ucc.ie/~adrian/cs1061/CS1061_L21.ppt

T13 Gestão de Memória Dinâmica

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 reservaror libertar memória durante a execução do programa.

Computer Science: A Structured Programming Approach Using C

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

T13 Gestão de Memória Dinâmica

Organização Conceptual da Memória

Computer Science: A Structured Programming Approach Using C

T13 Gestão de Memória Dinâmica

Computer Science: A Structured Programming Approach Using C

Só podemos aceder à memória alocada no heap através de um

ponteiro.

NOTA:

T13 Gestão de Memória Dinâmica

Acesso à Memória Dinâmica

Computer Science: A Structured Programming Approach Using C

T13 Gestão de Memória Dinâmica

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

Computer Science: A Structured Programming Approach Using C

T13 Gestão de Memória Dinâmica

Computer Science: A Structured Programming Approach Using C

Antes do C99, era necessário converter (casting) o apontador devolvido pela função de alocação de memória. Neste momento, já não é necessário fazê-lo, embora ainda seja

correto fazê-lo: pointer = (type*) malloc(size)

NOTA: Memory Allocation Casting

T13 Gestão de Memória Dinâmica

malloc

Computer Science: A Structured Programming Approach Using C

T13 Gestão de Memória Dinâmica

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 valor NULL.

Exemplo:

char *line;

int linelength = 100;

line = (char*)malloc(linelength);

T13 Gestão de Memória Dinâmica

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.

T13 Gestão de Memória Dinâmica

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); }

T13 Gestão de Memória Dinâmica

calloc

Computer Science: A Structured Programming Approach Using C

T13 Gestão de Memória Dinâmica

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 sizeofpara determinar o tamanho (em bytes) do tipo de dados.

T13 Gestão de Memória Dinâmica

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;}

T13 Gestão de Memória Dinâmica

realloc

Computer Science: A Structured Programming Approach Using C

T13 Gestão de Memória Dinâmica

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));

T13 Gestão de Memória Dinâmica

free

Computer Science: A Structured Programming Approach Using C

T13 Gestão de Memória Dinâmica

Computer Science: A Structured Programming Approach Using C

O apontador utilizado para libertar memória terá de ser obrigatoriamente do mesmotipo que o ponteiro utilizado para alocar memória.

NOTA:

T13 Gestão de Memória Dinâmica

Computer Science: A Structured Programming Approach Using C

A tentativa de utilização de memória previamente libertada através do seu apontadororigina um erro em run-time.

NOTA:

T13 Gestão de Memória Dinâmica

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.

T13 Gestão de Memória Dinâmica

Array of pointers (cont.)

Esta estrutura de dados é particularmente útil quando o número de elmentos de um array é variável.

T13 Gestão de Memória Dinâmica

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

FIM