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

[edição verificada][revisão pendente]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
m <source> -> <syntaxhighlight> (phab:T237267)
 
Linha 19:
 
Veja um exemplo de alocação dinâmica:
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h>
Linha 48:
return 0;
}
</syntaxhighlight>
</source>
 
Outros exemplos:
<sourcesyntaxhighlight lang="C">
int main()
{
Linha 62:
printf("%d\n", *q);
}
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="C">
int main()
{
Linha 74:
printf("%d\n", *p);
}
</syntaxhighlight>
</source>
 
*O compilador aceita *p=*q porque são ambos int.
Linha 83:
A função calloc() também serve para alocar memória, mas possui um protótipo um pouco diferente:
 
<sourcesyntaxhighlight lang="C">
void *calloc(size_t nelem, size_t elsize);
</syntaxhighlight>
</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:
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h> /* Para usar calloc() */
Linha 111:
return 0;
}
</syntaxhighlight>
</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)].
Linha 117:
=== realloc ===
A função realloc() serve para realocar memória e tem o seguinte protótipo:
<sourcesyntaxhighlight lang="C">
void *realloc(void *ptr, size_t size);
</syntaxhighlight>
</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:
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
#include <string.h>
Linha 148:
return 0;
}
</syntaxhighlight>
</source>
 
=== Alocação Dinâmica de Vetores ===
Linha 154:
A alocação dinâmica de vetores utiliza os conceitos aprendidos na aula sobre ponteiros e as funções de alocação dinâmica apresentados. Um exemplo de implementação para vetor real é fornecido a seguir:
 
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h>
Linha 190:
p = Liberar_vetor_real (p);
}
</syntaxhighlight>
</source>
 
=== Alocação Dinâmica de Matrizes ===
Linha 196:
A alocação dinâmica de memória para matrizes é realizada da mesma forma que para vetores, com a diferença que teremos um ponteiro apontando para outro ponteiro que aponta para o valor final, ou seja é um ponteiro para ponteiro, o que é denominado indireção múltipla. A indireção múltipla pode ser levada a qualquer dimensão desejada, mas raramente é necessário mais de um ponteiro para um ponteiro. Um exemplo de implementação para matriz real bidimensional é fornecido a seguir. A estrutura de dados utilizada neste exemplo é composta por um vetor de ponteiros (correspondendo ao primeiro índice da matriz), sendo que cada ponteiro aponta para o início de uma linha da matriz. Em cada linha existe um vetor alocado dinamicamente, como descrito anteriormente (compondo o segundo índice da matriz).
 
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h>
Linha 255:
...
}
</syntaxhighlight>
</source>