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

COMPARTILHAR:

Whatsapp Telegram Twitter Facebook Reddit

Aula 2.19 - Alocação dinâmica de memória em C

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.

COMENTÁRIOS

Nome

#ann,25,#HK,30,#LTCode,130,Artigo - Diversos,156,Artigo - Games,201,Artigo - Tecnologia,615,autor-thomaz,7,Coluna - Alternative World,24,Coluna - Fail,12,Coluna - Tec Line,14,Criptomoeda,72,Curiosidades - Diversos,49,Curiosidades - Tecnologia,50,en,2,estudo,8,HN,12,logica,14,Pentest,23,Programar C,29,Programar POO,6,Programar Python,6,Programar Shell,25,Programar verilog,12,qradar,4,Raspberry Pi,15,Redes,3,root,117,Shorty Awards,1,Smartphones - Reviews,33,Teoria,10,Top Nostalgia,2,VPN,19,WhatsApp,46,
ltr
item
Limon Tec: Aula 2.19: Alocação de memória em C #LTCode
Aula 2.19: Alocação de memória em C #LTCode
Aula 2.19 - Alocação dinâmica de memória em C
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmI65og5X32bSLCmBz3uJnZlmDvzOFWZWoZzyvUhh2rtp8Hr_kolKy02pOjxpkThrz8uHaTu3skUdeDJlkFEKkC2a9EabpwPzbwJ-hm-po0QIaNeNvYm5CJw3k4SbN03V-d2h1dxrW2tz4/s640/ltcode.jpg
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmI65og5X32bSLCmBz3uJnZlmDvzOFWZWoZzyvUhh2rtp8Hr_kolKy02pOjxpkThrz8uHaTu3skUdeDJlkFEKkC2a9EabpwPzbwJ-hm-po0QIaNeNvYm5CJw3k4SbN03V-d2h1dxrW2tz4/s72-c/ltcode.jpg
Limon Tec
https://www.limontec.com/2018/07/aula-2-19-linguagem-c-ltcode.html?m=0
https://www.limontec.com/?m=0
https://www.limontec.com/
https://www.limontec.com/2018/07/aula-2-19-linguagem-c-ltcode.html
false
2157924926610706248
UTF-8
Carregar todos posts Não encontramos nenhum post VER TUDO Ler mais Responder Cancelar resposta Deletar Por Home PÁGINAS POSTS Ver tudo RECOMENDADO PARA VOCÊ LABEL ARQUIVO SEARCH TODOS POSTS Não encontramos nenhum post relacionado a sua requisição VOLTAR PÁGINA INICIAL Domingo Segunda Terça Quarta Quinta Sexta Sábado Dom Seg Ter Qua Qui Sex Sab Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro Jan Fev Mar Abr Maio Jun Jul Ago Set Out Nov Dez apenas agora 1 minuto atrás $$1$$ minutes ago 1 hora atrás $$1$$ hours ago Ontem $$1$$ days ago $$1$$ weeks ago mais de 5 semanas atrás Seguidores Seguir ESTE CONTEÚDO ESTÁ BLOQUEADO PASSO 1: Compartilhe com seus amigos PASSO 2: Clique no link compartilhado Copiar Todo Código Selecionar Todo Código Todos códigos foram copiados para seu clipboard Não é possível copiar códigos / textos, por favor aperte [CTRL]+[C] (ou CMD+C no Mac) para copiar Tabela de conteúdo