Programar em C/Gerenciamento de memória: diferenças entre revisões
[edição verificada] | [edição verificada] |
Conteúdo apagado Conteúdo adicionado
Sem resumo de edição |
Sem resumo de edição |
||
Linha 12:
Para alocar um espaço na memória, precisamos fornecer à função <tt>malloc</tt> o número de bytes desejados. Para isso, precisaremos usar o operador <tt>sizeof</tt>, introduzido na seção anterior. Veja um exemplo.
#include <stdio.h>
#include <stdlib.h>
Linha 40 ⟶ 41:
return 0;
}
</source>
É importante notar que a função malloc retorna um ponteiro NULL caso não consiga alocar memória.
=== calloc ===
A função calloc() também serve para alocar memória, mas possui um protótipo um pouco diferente:
Sintaxe: <source lang="C"> ▼
#include <stdlib.h>▼
void *calloc(size_t nelem, size_t elsize);
</source>
A função calloc reserva um bloco com o tamanho (nelem x elsize) octetos consecutivos, isto é, aloca memória suficiente para um vetor de num objetos de tamanho size. Diferente de malloc(), o bloco reservado é inicializado a 0. Essa função retorna um ponteiro void* para o primeiro byte alocado. O ponteiro void* pode ser atribuído a qualquer tipo de ponteiro. Se não houver memória suficiente para alocar a memória requisitada a função calloc() retorna um ponteiro nulo.
Exemplo:
int n;
int i;
... /* Determina o valor de n em algum lugar */
p = calloc(n, sizeof(int)); /* Aloca n números inteiros p pode agora ser tratado como um vetor com n posicoes */
▲<source lang="C">
{
▲ #include <stdlib.h>
printf ("** Erro: Memoria Insuficiente **");
exit(0);
▲ int main() {
}
▲ int *str = NULL;
for (i=0; i<a ; i++) /* p pode ser tratado como um vetor com n posicoes */
...
▲ free(str);
return 0;
}
</source>
No exemplo acima, é alocada memória suficiente para se colocar n números inteiros. O operador sizeof() retorna o número de bytes de um inteiro. Ele é útil para se saber o tamanho de tipos. O ponteiro void * que calloc() retorna é convertido para um int* pelo cast e é atribuído a p. A declaração seguinte testa se a operação foi bem sucedida. Se não tiver sido, p terá um valor nulo, o que fará com que !p retorne verdadeiro. Se a operação tiver sido bem sucedida, podemos usar o vetor de inteiros alocados normalmente, por exemplo, indexando-o de p[0] a p[(a-1)].
=== realloc ===
A função realloc() serve para realocar memória e tem o seguinte protótipo:
▲Sintaxe: <source lang="C">
<source lang="C">
void *realloc(void *ptr, size_t size);
</source>
A função realloc ajusta o tamanho de um bloco a size octetos consecutivos. A função modifica o tamanho da memória previamente alocada com malloc, calloc ou realloc e apontada por ''ptr'' para o tamanho especificado por ''size''. O valor de ''size'' pode ser maior ou menor que o original. Um ponteiro para o bloco é devolvido porque realloc() pode precisar mover o bloco para aumentar seu tamanho. Se isso ocorrer, o conteúdo do bloco antigo é copiado no novo bloco, o bloco antigo é liberado e nenhuma informação é perdida. Se não precisar mover, o valor retornado é igual a ptr. Se ''ptr'' for nulo, a função aloca size bytes e devolve um ponteiro, funcionando como malloc(); se ''size'' é zero, a memória apontada por ptr é liberada. Se não houver memória suficiente para a alocação, um ponteiro nulo é devolvido e o bloco original é deixado inalterado.
Exemplo:
<source lang="C">
#include <stdio.h>
Linha 116 ⟶ 112:
return 0;
}
</source>
|