computação eletrônica: alocação dinâmica de...
TRANSCRIPT
![Page 2: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/2.jpg)
10-Alocação dinâmica
Plano de aula
1 Alocação dinâmica de memória
2 Alocação dinâmica de vetor unidimensional
![Page 3: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/3.jpg)
10-Alocação dinâmica
Problema
Escrever um programa que armazena num vetor dados. Aquantidade de dados a inserir é desconhecida, e pode sermuito grande ou bastante pequena.
Tamanho do vetor?Pequeno: Limita bastante o programaGrande: Usa muita memória, mesmo sem necessidade
Como fazer?Alocar o vetor durante a execução do programa
![Page 4: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/4.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
1 Alocação dinâmica de memóriaComando mallocComando freeComando sizeof
2 Alocação dinâmica de vetor unidimensional
![Page 5: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/5.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Memória como gaveteiro (continuação)...
Alocação estática de memória
Declarar uma variável é “colar” uma etiqueta numa(s)gaveta(s).A etiqueta fica colada na gaveta durante a execuçãointeira do programa.
Alocação dinâmica de memória
Colar e remover etiquetas das gavetas durante a execução doprograma.
![Page 6: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/6.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando malloc
O comando malloc
#include<stdlib.h>void *malloc(size_t size)
Aloca durante a execução a quantidade de memóriapedida (em bytes)Retorna um ponteiro genérico sobre o início do espaçoalocadoRetorna NULL em caso de problema
Observações
Converter o ponteiro da forma seguinte (cast):
(tipo*) malloc(tamanho);
A memória não é inicializadaVerificar a alocação
![Page 7: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/7.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando malloc
Alocação dinâmica de um inteiro
int *n;n = (int*) malloc(4);if (n == NULL){
printf("Erro durante alocacao de memoria\n");}else{
*n = 12;}
![Page 8: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/8.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando free
O comando free
Liberação de memória dinamicamente alocada:Fim do programaComando free
#include<stdlib.h>void free(void *ptr)
Libera a memória apontada por ptr
Observações:ptr continua com o mesmo endereçoRecomendado atribuir NULL ao ponteiro
![Page 9: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/9.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando free
Cuidados com free
Não liberar memória alocada estaticamenteint n;free(&n); // Errado: Memoria alocada estaticamente
Não liberar duas vezes o mesmo elementoint *n;n = (int*)malloc(4);free(n);free(n); // Errado: Memoria ja liberada
![Page 10: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/10.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando free
int *p;p = (int*) malloc(4);
*p = 2;printf("%d\n", *p);free(p);p = NULL; // Recomendado #30
#20
#10
#0 #1 #2 #3 #4 #5 #6 #7 #8 #9
p
#24
2
NULL
Tela
2
![Page 11: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/11.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando free
int *p;p = (int*) malloc(4);
*p = 2;printf("%d\n", *p);free(p);p = NULL; // Recomendado #30
#20
#10
#0 #1 #2 #3 #4 #5 #6 #7 #8 #9
p
#24
2
NULL
Tela
2
![Page 12: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/12.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando free
int *p;p = (int*) malloc(4);
*p = 2;printf("%d\n", *p);free(p);p = NULL; // Recomendado #30
#20
#10
#0 #1 #2 #3 #4 #5 #6 #7 #8 #9
p
#24
2
NULL
Tela
2
![Page 13: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/13.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando free
int *p;p = (int*) malloc(4);
*p = 2;printf("%d\n", *p);free(p);p = NULL; // Recomendado #30
#20
#10
#0 #1 #2 #3 #4 #5 #6 #7 #8 #9
p
#24
2
NULL
Tela
2
![Page 14: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/14.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando free
int *p;p = (int*) malloc(4);
*p = 2;printf("%d\n", *p);free(p);p = NULL; // Recomendado #30
#20
#10
#0 #1 #2 #3 #4 #5 #6 #7 #8 #9
p
#24
2
NULL
Tela2
![Page 15: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/15.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando free
int *p;p = (int*) malloc(4);
*p = 2;printf("%d\n", *p);free(p);p = NULL; // Recomendado #30
#20
#10
#0 #1 #2 #3 #4 #5 #6 #7 #8 #9
p
#24
2
NULL
Tela2
![Page 16: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/16.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando free
int *p;p = (int*) malloc(4);
*p = 2;printf("%d\n", *p);free(p);p = NULL; // Recomendado #30
#20
#10
#0 #1 #2 #3 #4 #5 #6 #7 #8 #9
p
#24
2
NULL
Tela2
![Page 17: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/17.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando sizeof
O comando sizeof
Tamanho das variáveis/dos tiposPotencialmente difíceis de calcular (estrutura)Dependência da arquitetura do computador
size_t sizeof nome;size_t sizeof(int);
Retorna o tamanho (em bytes) da variável/do tipo nocomputador
![Page 18: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/18.jpg)
10-Alocação dinâmica
Alocação dinâmica de memória
Comando sizeof
Exemplo de uso do sizeof
typedef struct {char nome[250];int mat;char turma[64];
} TAluno;int main(void) {
TAluno *a;printf("Tamanho de um int=%ld\n", sizeof(int));printf("Tamanho de um TAluno=%ld\n", sizeof(TAluno));a = (TAluno*) malloc(sizeof(TAluno));a->mat = 123;...
}
TelaTamanho de um int=4Tamanho de um TAluno=320
![Page 19: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/19.jpg)
10-Alocação dinâmica
Alocação dinâmica de vetor unidimensional
1 Alocação dinâmica de memória
2 Alocação dinâmica de vetor unidimensional
![Page 20: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/20.jpg)
10-Alocação dinâmica
Alocação dinâmica de vetor unidimensional
Alocação dinâmica de vetor unidimensional
Vetor unidimensionalSequência de n elementos do mesmo tipoUm ao lado do outro na memória
Alocação de um vetorAlocar um espaço de n vezes o tamanho do tipo:tipo *p;p = (tipo*)malloc(n*sizeof(tipo));
![Page 21: Computação eletrônica: Alocação dinâmica de memóriacz/if165/NotasAulas/10-alocacao_dinamica.pdf · Alocação dinâmica de memória Memória como gaveteiro (continuação)](https://reader031.vdocuments.site/reader031/viewer/2022022719/5c6042a709d3f2e0528b4e3b/html5/thumbnails/21.jpg)
10-Alocação dinâmica
Alocação dinâmica de vetor unidimensional
Exemplo de alocação dinâmica de vetor
int i,n, *p;printf("Tamanho do vetor? ");scanf("%d", &n);p = (int*) malloc(n*sizeof(int));if (p == NULL){
printf("Erro na alocacao de memoria");}else{
for (i=0; i<n; i++){
p[i] = i;}...
}