If you continue to use this site, you consent to our Privacy Policy.

17 julho 2018

Aula 2.19: Alocação de memória em C #LTCode

Este artigo faz parte do projeto #LTCode.

A alocação dinâmica de memória permite que você reserve espaços na memória de tamanhos arbitrários durante a execução do programa, assim podendo acessá-los através de apontadores. 

Quando você declara uma variável, o sistema operacional reserva uma quantidade de espaço na memória para essa variável. Na aula 2.2 você viu que o operador sizeof() retorna o tamanho em bytes do tipo de dado inserido entre (). Exemplo:


Portanto ele retornará o tamanho em bytes de registros, vetores, variáveis simples etc. Se eu criar um vetor de inteiros de 10 posições - v[10] - , ao checar com sizeof - sizeof(v) - veremos que o sistema operacional vai alocar 40 bytes, afinal é um inteiro de 4 bytes vezes 10 posições do vetor.

Existe uma função presente na biblioteca sdtlib.h, chamada malloc, que permite você dizer ao sistema operacional exatamente qual tamanho (do bloco de memória em bytes) você deseja alocar, assim a função retorna um ponteiro para o bloco de memória alocado. Confira um exemplo abaixo:

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.


Na linha 11 foi declarado um ponteiro chamado vetor. Este ponteiro vai apontar para o bloco de memória alocado na linha 14 com malloc. A função malloc está alocando um espaço em byte dado pelo tamanho do vetor digitado pelo usuário vezes o tamanho de um inteiro (pois o ponteiro vetor declarado na linha 11 é inteiro), no exemplo malloc(n*sizeof(int)) ou seja malloc(n*4), como usuário digitou 3 será malloc(3*4).

Como a função malloc retorna um ponteiro do tipo void, é necessário fazer casting que nada mais é que forçar que o ponteiro do tipo void seja de outro tipo, no caso int já que o ponteiro vetor é do tipo int, como você pode notar na linha 14 (int *) malloc(...

Você certamente lembra que a primeira posição de um vetor x[] é um ponteiro, logo como o ponteiro vetor criado na linha 11 aponta para o início de um bloco de tamanho de n posições de inteiros, ele pode ser considerado um vetor. Por isso que a função leitura (linha 3) recebe o ponteiro como vetor[].

Vale notar que a função malloc pode alocar um espaço na memória que contém lixo, para evitar isso você pode usar a função calloc(argumento1, argumento2) que inicializa com zero as posições da memória alocada, seguindo o exemplo da imagem ficaria assim: calloc(n, sizeof(int));

Também é recomendado controlar se a função malloc funcionou, por exemplo se seu computador teve memória suficiente livre para ser alocada. Para isso basta fazer uma condição, utilizando o programa da imagem acima como exemplo:

if(vetor==NULL){
    printf("não foi possível alocar memória");
}

Ou seja, se o ponteiro que recebe malloc retornar nulo, imprima uma mensagem de error pois o sistema operacional não conseguiu alocar memória.

Você deve estar se perguntando que função é aquela na linha 20. A função free() simplesmente libera a memória alocada, ou seja o bloco de memória apontado pelo ponteiro vetor do programa acima irá ficar disponível para o sistema operacional fazer o que quiser. Note que tudo que contém no bloco de memória desalocado não será preenchido com zero, ou seja, não será apagado. 

Para finalizar a aula de hoje, aprenderemos como utilizar a função realloc() . Como se percebe pelo nome, ela serve para realocar memória, ou seja, se utilizamos o ponteiro vetor da imagem acima para alocar memória e queremos mudar o tamanho dele, podemos utilizar essa função. Seu uso é semelhante ao malloc, confira um exemplo com base na imagem acima de como realocar memória:


Na linha 20 foi solicitado ao usuário para mudar o tamanho do vetor, sendo assim na linha 22 foi realocado memória com realloc(ponteiro, tamanho em byte);

>> Próxima aula, clique aqui.





~ Artigos recomendados para você:









Please Donate To Bitcoin Address: [[address]]





Donation of [[value]] BTC Received. Thank You.


[[error]]