Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf ·...
Transcript of Programação Introdução à Programaçãosebastiao/teaching/2021/PROG/Lectures/T11.pdf ·...
T. 11 – Gestão de Memória Dinâmica
1
ProgramaçãoIntrodução à Programação
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
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
Organização Conceptual da Memória
T11 Gestão de Memória Dinâmica
4
Computer Science: A Structured Programming Approach Using C
T11 Gestão de Memória Dinâmica
5
Acesso à Memória Dinâmica
T11 Gestão de Memória Dinâmica
6
Funções de Gestão de Memória
T11 Gestão de Memória Dinâmica
7
T11 Gestão de Memória Dinâmica
8
malloc
T11 Gestão de Memória Dinâmica
9
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
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
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
calloc
T11 Gestão de Memória Dinâmica
13
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
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
realloc
T11 Gestão de Memória Dinâmica
16
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
free
T11 Gestão de Memória Dinâmica
18
T11 Gestão de Memória Dinâmica
19
Computer Science: A Structured Programming Approach Using C
T11 Gestão de Memória Dinâmica
20
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
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
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