A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Leandro Almeida  As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa.

Apresentações semelhantes


Apresentação em tema: "Leandro Almeida  As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa."— Transcrição da apresentação:

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

17


Carregar ppt "Leandro Almeida  As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa."

Apresentações semelhantes


Anúncios Google