Programar em C/Gerenciamento de memória: diferenças entre revisões

[edição verificada][edição verificada]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
Sem resumo de edição
Abacaxi (discussão | contribs)
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.
 
<source lang="C">
#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>
 
Sintaxe: <source lang="C">
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.
Descrição:
A função calloc reserva um bloco com o tamanho (nelem x elsize) octetos consecutivos. O bloco reservado é inicializado a 0.
 
Exemplo:
Sintaxe: <source lang="C">
#include <stdlibstdio.h>
#include <stdlib.h> /* Para usar calloc() */
 
int main () {
Valor de retorno :
int *str = NULLp;
 
int n;
Se a operação foi um sucesso, calloc retorna um ponteiro sobre o inicio do bloco reservado. <br>
int i;
Se não houver espaço suficiente ou se nelem ou elsize valem 0 ,calloc retorna NULL . <br>
... /* Determina o valor de n em algum lugar */
Ex:
p = calloc(n, sizeof(int)); /* Aloca n números inteiros p pode agora ser tratado como um vetor com n posicoes */
<source lang="C">
freeif (str!p);
#include <stdio.h>
{
#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 */
 
str = (char *) calloc(10, sizeof(int))p[i] = i*i;
...
printf("%d\n", str[9]);
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">
#include <stdlib.h>
 
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.
Descrição: A função realloc ajusta o tamanho de um bloco a size octetos consecutivos.
 
Argumentos:<br>
<b>ptr:</b> Aponta para um bloco criado por malloc, calloc ou realloc.Se o ponteiro é NULL realloc equivale a malloc.<br>
<b>size:</b> Tamanho do novo bloco em octetos.<br>
 
Valor de retorno :
Se a função terminar normalmente ela retorna o endereço do novo bloco.Pode acontecer que o endereço mude com relação ao endereço usado em argumento, nesse caso o conteudo do bloco é transferido para o novo bloco e a região antiga e liberada automaticamente.<br>
Se faltar lugar na memória ou size for igual a 0 realloc retorna NULL .<br>
 
Ex:
 
Exemplo:
<source lang="C">
#include <stdio.h>
Linha 116 ⟶ 112:
return 0;
}
 
</source>