View
233
Download
0
Category
Preview:
Citation preview
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
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
É 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
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
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.
Recommended