C - Alocação Dinâmica
Alocação Dinâmica
Malloc (Mass Memory Allocation)
Utilizamos a função malloc() quando não conseguimos prever a quantidade de memória que nosso programa irá necessitar.
A função malloc() pode ser utilizada em run time para determinar o tamanho de um array.
Protótipo:
void * malloc( size_t size );
Onde size_t é do tipo unsigned int que os sistemas utilizam para armazenar o tamanho do objeto.
Exemplo:
malloc( 50 );
Retorno:
A função malloc() retorna um ponteiro para um array de bytes caso seja possível alocar os recursos.
Caso negativo (não temos mas memória para ser alocada), será retornado NULL.
Detalhes:
No protótipo da função temos void * que é utilizado no retorno como um coringa, já que podemos utilizar
o malloc para qualquer tipo de objeto. (char, int, ... )
Então antes da função malloc() deve-se utilizar um cast para deixar explícito o tipo de bytes que será retornado.
Exemplo:
(char *) malloc( 50 );
No exemplo acima utilizamos 50 para determinar o tamanho do objeto que será alocado, porém não se deve
utilizar diretamente números como parâmetro, ao invés disso utilizamos a operador sizeof para manter a
portabilidade.
Lembre-se o operador sizeof dentro do parâmetro não afetará o retorno da função malloc().
Exemplo:
(char *) malloc( 50 * sizeof(char) );
No exemplo acima, a memória ainda não foi inicializada e pode conter sujeira (lixo) de outro programa que
utilizou este espaço. Para limpar este espaço, utilize a função memset();
Memset
memset() é normalmente utilizado para inicializar ponteiros, arrays e estruturas.
Exemplo:
memset(array, '\0', sizeof(tipo array) );
memset(&estrutura, '\0', sizeof(estrutura) );
P.S.: A função memset() substitui a função bzero() que está depreciada.
Calloc (Cleared Memory Allocation)
A função calloc() aloca um array de memória e automaticamente preenche (zera) o array com 0.
Parâmetros:
1º Tamanho
2º Tamanho (em bytes) do tipo
Exemplo:
char *ptr;
ptr = calloc( 20, sizeof(char) );
Detalhes:
Na função calloc() não é necessário fazer cast para determinar o tipo do ponteiro que será utilizado,
porque o mesmo será definido automaticamente.
Embora as funções malloc() e calloc() tenham parâmetros diferentes, elas essenciamente fazem a mesma coisa.
Free (Freeing Dynamic Memory)
Como vimos anteriormente, usamos a funções malloc() e calloc() para alocar memória, agora será visto
como liberar está memória previamente alocada.
Detalhes:
Lembre-se cada programa é responsável em liberar sua memória previamente alocada e sendo possível somente
uma vez o espaço alocado.
Exemplo:
int *ptr;
ptr = (int *) malloc( 10 * sizeof(int) );
if (!ptr) {
printf ("Erro: Memória Insuficiente");
exit(-1);
}
free(ptr);
Erros comuns:
1º Utilizar ponteiros já desalocados
2º Não desalocar ponteiros alocados
Realloc (Resizing arrays)
Redimensionar ponteiros já alocados (tanto para maior quanto para menor) criados previamente pelas funções malloc ou calloc() devemos utilizamos a função realloc().
Detalhes:
Caso seja alterado o array para um tamanho menor ao original, o restante do array será retornado para o
sistema operacional para reciclagem.
Exemplo:
ptr = realloc( 5 * sizeof(int) );
Autor
Douglas Schilling Landgraf dougsland [*AT*] gmail [*DOT*] [*COM*]
Malloc (Mass Memory Allocation)
Utilizamos a função malloc() quando não conseguimos prever a quantidade de memória que nosso programa irá necessitar.
A função malloc() pode ser utilizada em run time para determinar o tamanho de um array.
Protótipo:
void * malloc( size_t size );
Onde size_t é do tipo unsigned int que os sistemas utilizam para armazenar o tamanho do objeto.
Exemplo:
malloc( 50 );
Retorno:
A função malloc() retorna um ponteiro para um array de bytes caso seja possível alocar os recursos.
Caso negativo (não temos mas memória para ser alocada), será retornado NULL.
Detalhes:
No protótipo da função temos void * que é utilizado no retorno como um coringa, já que podemos utilizar
o malloc para qualquer tipo de objeto. (char, int, ... )
Então antes da função malloc() deve-se utilizar um cast para deixar explícito o tipo de bytes que será retornado.
Exemplo:
(char *) malloc( 50 );
No exemplo acima utilizamos 50 para determinar o tamanho do objeto que será alocado, porém não se deve
utilizar diretamente números como parâmetro, ao invés disso utilizamos a operador sizeof para manter a
portabilidade.
Lembre-se o operador sizeof dentro do parâmetro não afetará o retorno da função malloc().
Exemplo:
(char *) malloc( 50 * sizeof(char) );
No exemplo acima, a memória ainda não foi inicializada e pode conter sujeira (lixo) de outro programa que
utilizou este espaço. Para limpar este espaço, utilize a função memset();
Memset
memset() é normalmente utilizado para inicializar ponteiros, arrays e estruturas.
Exemplo:
memset(array, '\0', sizeof(tipo array) );
memset(&estrutura, '\0', sizeof(estrutura) );
P.S.: A função memset() substitui a função bzero() que está depreciada.
Calloc (Cleared Memory Allocation)
A função calloc() aloca um array de memória e automaticamente preenche (zera) o array com 0.
Parâmetros:
1º Tamanho
2º Tamanho (em bytes) do tipo
Exemplo:
char *ptr;
ptr = calloc( 20, sizeof(char) );
Detalhes:
Na função calloc() não é necessário fazer cast para determinar o tipo do ponteiro que será utilizado,
porque o mesmo será definido automaticamente.
Embora as funções malloc() e calloc() tenham parâmetros diferentes, elas essenciamente fazem a mesma coisa.
Free (Freeing Dynamic Memory)
Como vimos anteriormente, usamos a funções malloc() e calloc() para alocar memória, agora será visto
como liberar está memória previamente alocada.
Detalhes:
Lembre-se cada programa é responsável em liberar sua memória previamente alocada e sendo possível somente
uma vez o espaço alocado.
Exemplo:
int *ptr;
ptr = (int *) malloc( 10 * sizeof(int) );
if (!ptr) {
printf ("Erro: Memória Insuficiente");
exit(-1);
}
free(ptr);
Erros comuns:
1º Utilizar ponteiros já desalocados
2º Não desalocar ponteiros alocados
Realloc (Resizing arrays)
Redimensionar ponteiros já alocados (tanto para maior quanto para menor) criados previamente pelas funções malloc ou calloc() devemos utilizamos a função realloc().
Detalhes:
Caso seja alterado o array para um tamanho menor ao original, o restante do array será retornado para o
sistema operacional para reciclagem.
Exemplo:
ptr = realloc( 5 * sizeof(int) );
Autor
Douglas Schilling Landgraf dougsland [*AT*] gmail [*DOT*] [*COM*]
