Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouLeila Bergler Duarte Alterado mais de 8 anos atrás
1
Leandro Almeida lma3@cin.ufpe.br
2
As declarações abaixo alocam memória para diversas variáveis. A alocação é estática, pois acontece antes que o programa comece a ser executado: char c; int i; int v[10]; Às vezes, a quantidade de memória a alocar só se torna conhecida durante a execução do programa. Para lidar com essa situação é preciso recorrer à alocação dinâmica de memória
3
A alocação dinâmica é gerenciada pelas funções malloc e free, que estão na biblioteca stdlib Para usar esta biblioteca, é preciso dizer #include no início do programa.
4
A função malloc (abreviatura de memory allocation) aloca um bloco de bytes consecutivos na memória do computador e devolve o endereço desse bloco. ◦ O número de bytes é especificado no argumento da função ◦ No seguinte fragmento de código, malloc aloca 1 byte: char *ptr; ptr = (char *) malloc(1); scanf( "%c", ptr);
5
O endereço devolvido por malloc é do tipo "genérico" void *. O programador armazena esse endereço num ponteiro de tipo apropriado. No exemplo anterior, o endereço é armazenado num ponteiro-para-char.
6
Para alocar um tipo-de-dado que ocupa vários bytes, é preciso recorrer ao operador sizeof, que diz quantos bytes o tipo especificado tem: typedef struct { int dia, mes, ano; } data; data *d; d = (data *) malloc( sizeof (data)); d->dia = 31; d->mes = 12; d->ano = 2008;
7
Se a memória do computador já estiver toda ocupada, malloc não consegue alocar mais espaço e devolve NULL. Convém verificar essa possibilidade antes de prosseguir: data *ptr; ptr = (data *) malloc( sizeof (data)); if (ptr == NULL) { printf( "Socorro! malloc devolveu NULL!\n"); }
8
As variáveis alocadas estaticamente dentro de uma função desaparecem quando a execução da função termina.estaticamente Já as variáveis alocadas dinamicamente continuam a existir mesmo depois que a execução da função termina Se for necessário liberar a memória ocupada por essas variáveis, é preciso recorrer à função free.
9
A função free libera a porção de memória alocada por malloc O comando free(ptr) avisa o sistema de que o bloco de bytes apontado por ptr está livre A próxima chamada de malloc poderá tomar posse desses bytes. Convém não deixar ponteiros "soltos" (= dangling pointers) no seu programa, pois isso pode ser explorado por hackers para atacar o seu computador.pode ser explorado por hackers para atacar o seu computador Portanto, depois de cada free( ptr), atribua NULL a ptr : free( ptr); ptr = NULL;
10
Eis como um vetor (=array) com n elementos inteiros pode ser alocado (e depois desalocado) durante a execução de um programa: #include main () { int *v; int n, i; printf("Digite o tamanho do vetor"); scanf( "%d", &n); v = (int *) malloc( n * sizeof (int)); for (i = 0; i < n; i++) scanf( "%d", &v[i]); for (i = n; i > 0; i--) printf( "%d ", v[i-1]); free(v); v = NULL; getche(); }
11
O comando v = (int *) malloc(100 * sizeof (int)); tem o mesmo efeito que a alocação estática: int v[100];
12
Matrizes bidimensionais são implementadas como vetores de vetores Uma matriz com m linhas e n colunas é um vetor cujos m elementos possuem um vetor de n elementos int **A; int i,j,m,n; printf("Digite o tamanho da matriz"); scanf("%d %d",&m, &n); A = (int **) malloc( m * sizeof (int *)); for (i = 0; i < m; i++) A[i] = (int *) malloc( n * sizeof (int));
13
for (i = 0; i < m; i++) for (j = 0; j < n; j++) scanf("%d",&A[i][j]); for (i = 0; i < m; i++){ for (j = 0; j < n; j++) printf("%d ",A[i][j]); printf("\n"); } /* Desaloca a matriz */ for(i = 0; i < m; i++){ free(A[i]); A[i] = NULL; } free(A); A = NULL;
14
Faça um programa que leia um valor n e crie dinamicamente um vetor de n elementos e passe esse vetor para uma função que vai ler os elementos desse vetor. Depois, no programa principal, o vetor preenchido deve ser impresso. Além disso, antes de finalizar o programa, deve-se liberar a área de memória alocada.
15
#include /*formato de preenchimento 1*/ void preencher_vetor_A (int vetor[], int tam) { for (int i = 0; i < tam; i++) { printf("\n Digite o %d elemento", i); scanf("%d",&vetor[i]); } /*outro formato de preenchimento*/ void preencher_vetor_B (int *vetor, int tam) { for (int i = 0; i < tam; i++) { printf("\n Digite o %d elemento", i); scanf("%d",&vetor[i]); } main() { int *v, qe; printf("Digite a quantidade de elementos"); scanf("%d",&qe); v = (int *) malloc(qe * sizeof(int)); preencher_vetor_B(v, qe); for (int i = 0; i < qe; i++) printf("%d ", v[i]); free(v); v = NULL; getche(); }
16
#include /*Formato correto de preenchimento da matriz*/ void preencher_matriz (int **matriz, int lin, int col) { int a, b; for (a = 0; a < lin; a++) { for (b = 0; b < col; b++) { printf("\n Digite o [%d %d] elemento", a, b); scanf("%d",&matriz[a][b]); } main() { int **mat, lin, col; printf("Digite a quantidade de elementos"); scanf("%d %d",&lin, &col); mat = (int **) malloc(lin * sizeof(int *)); for (int i = 0; i < col; i++) mat[i] = (int *) malloc(col * sizeof(int)); preencher_matriz(mat, lin, col); for (int i = 0; i < lin; i++) { for (int j = 0; j < col; j++) printf("%d ", mat[i][j]); printf("\n"); } for (int j = 0; j < col; j++) { free(mat[j]); mat[j] = NULL; } free(mat); mat = NULL; getche(); }
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.