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)
Linha 10:
Essas duas funções são as mais básicas para o gerenciamento de memória. '''<tt>malloc</tt>''' é responsável pela alocação de um pedaço de memória, e '''<tt>free</tt>''' é responsável por liberar esse pedaço de memória.
 
A função malloc() serve para alocar memória e tem o seguinte protótipo:
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.
void *malloc (unsigned int num);
void free (void * ptr);
 
Para alocar um espaço na memória, precisamos fornecer à função <tt>malloc</tt> o número de bytes desejados. Ela aloca na memória e 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 malloc() retorna um ponteiro nulo.
 
Para saber o tamanho do bloco a alocar, precisaremos usar o operador <tt>sizeof</tt>. Ele permite também saber automaticamente o tamanho de ''structs'' criadas pelo usuário.
 
Veja um exemplo de alocação dinâmica:
<source lang="C">
#include <stdio.h>
Linha 43 ⟶ 50:
</source>
 
Outros exemplos:
É importante notar que a função malloc retorna um ponteiro NULL caso não consiga alocar memória.
<source lang="C">
int main()
{
int *p, *q;
p = malloc(sizeof(int));
q = p;
*p = 10;
printf("%d\n", *q);
*q = 20;
printf("%d\n", *q);
}
</source>
<source lang="C">
int main()
{
int *p, *q;
p = malloc(sizeof(int));
q = malloc(sizeof(int));
*p = 10;
*q = 20;
*p = *q;
printf("%d\n", *p);
}
</source>
 
*O compilador aceita *p=*q porque são ambos int.
*O compilador aceita também p=q porque ambos são ponteiros e apontam para o mesmo tipo.
*Podemos simplificar p = malloc(sizeof(int)); por p = malloc(4); mas como temos sistemas operacionais de 16,32, 64 bits a primeira declaração torna as coisas mais portáveis.
 
=== calloc ===
A função calloc() também serve para alocar memória, mas possui um protótipo um pouco diferente:
 
<source lang="C">
void *calloc(size_t nelem, size_t elsize);
</source>
Linha 65 ⟶ 100:
... /* 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 */
//p = malloc(n*sizeof(int)); /* Maneira equivalente usando malloc. */
if (!p)
{
Linha 70 ⟶ 106:
exit(0);
}
for (i=0; i<a n; i++) /* p pode ser tratado como um vetor com n posicoes */
p[i] = i*i;
...
Linha 81 ⟶ 117:
=== realloc ===
A função realloc() serve para realocar memória e tem o seguinte protótipo:
<source lang="C">
void *realloc(void *ptr, size_t size);
</source>