Estaremos aqui abordando o uso de ponteiro de memória, neste pequeno exemplo de código.
Vemos aqui 3 variáveis:
mensagem
pmensagem
pmensagem2
Podemos notar, que a primeira é um vetor estático, enquanto as duas seguintes são ponteiros.
O ponteiro trabalha como uma variável numérica, pois armazena o endereço. Desta forma quando referenciamos um ponteiro, não mostramos o valor, mas sim o endereço que ele se encontra.
O C é uma linguagem de tipagem fraca, com isso podemos manipular ponteiros de caracteres, aplicando cálculos matemáticos, como no exemplo acima.
Notemos que ao indicar um ponteiro, podemos apontar qualquer parte do endereço de um segmento de memória, não só o começo. No exemplo acima, pulamos cada vez que lemos a posição 1 byte.
Desta forma podemos ir rolando o ponteiro para a posição que quisermos.
Estaremos abordando como alocar uma variavel dinamica em C.
No exemplo acima, podemos verificar, que existe uma variavel pdinamica. Que é um ponteiro de variável.
Iremos explicar o ponteiro em outro post.
O comando malloc, pega um segmento da memória, e reserva para o ponteiro.
Alocação de memória deve ser usada com muito cuidado, pois seu uso inadvertido, pode causar crash do sistema, ou o que chamamos de memory leak. O memory leak é como o próprio nome diz, quando perdemos o controle das alocações, não removendo a alocação da memória após seu uso.
Na alocação dinâmica, a alocação e desalocação da memória é feita pelo software (programador), se houver uma falha no processo de desalocação aquele segmento de memória ficará inutilizado até que a aplicação feche.
Em situações onde houver rechamada constante de um bloco de instruções que perde memória, o programa irá capturar segmentos de tal volume, que em um dado momento a aplicação ficará sem recursos (memória livre disponível).
O comando free, já faz a liberação da memória, quando apontamos o endereço da memória, dizemos ao Sistema Operacional, que aquele segmento de memória criado no endereço apontado, já pode ser liberado.
Como o sistema operacional já sabe o tamanho criado no momento da alocação, não é necessário identificar o tamanho do segmento.