malloc, uma nova abordagem
12 Junho 2009
Faz algum tempo desde meu primeiro post sobre a função malloc, ele não esta muito bem estruturado ficando rasoavelmente inconpreensivel então aqui uma nova abordagem no tópico:
A função malloc é uma função da bilbioteca padrão da linguagem C, a sua função é alocar dinamicamente espaços de memória para poder ser usado no programa, mas qual a utilidade disso?
Bem, vamos supor que nós tenhamos que escrever um programa que trabalha com matrizes, então nos criamos uma array bidimensional para armazenar os valores da matrizes para fazer os calculos, simples não é? mas pera ai, e se o tamanho da matriz variar? hora o usuario pode digitar uma matrz 2×2, hora 3×3, ate mesmo algo como 255×255, ai nós temos um problema, talvez se nós criarmos uma matriz grande de forma que o usuario não seja capaz de enche-la, digamos algo em torno de 1000×1000, dai nós usamos uma variavel para contar o número de linhas e outra para o número de colunas da matriz, perfeito! sera?
Bem, a abordagem acima funciona, mas sinceramente ela é horrivel, se for algum programa para auxiliar estudantes do ensino médio matrizes não passam de 4×4, são 8 elementos de um total de 1.000.000, um disperdicio tremendo de memória! Por outro lado se for uma aplicação cientifica nada garante que o total de dados não seja maior do 1.000.000, e o pior se nós temos que trabalhar com um número variavel de matrizes, como a gente faria? criar 1000 matrizes para ter certeza que não ficamos sem? uma abordagem horrivel, mas o que malloc tem a ver com tudo isso?
malloc permite que a gente crie durante a execução do programa uma matriz do tamanho que quisermos, mas como!? Simples, se pergunta para o usuario o tamanho da matriz que ele quer, então cria-se a matriz do tamanho que o usuario disse:
n = tamanho_matriz(); // pseudo-funcao que pergunta o tamanho da array para o usuario
int **ptr, i;
ptr = malloc(sizeof(int*)*n);
for( i=0; i<n; i++){
ptr[i] = malloc(sizeof(int) * n);
}
Mágico isso não é? mas como funciona? bem malloc leva como argumento o total de bytes para alocar, por isso do sizeof() que retorna o tamanho de um tipo de dado em bytes, e retorna um ponteiro para o inicio dessa seção de memória, o ponteiro é do tipo void*, e a razão disso é bem simples, malloc aloca espaço para qualquer tipo de dados, inclusive struct (desde que você use `sizeof(struct struct_name)`) então o tipo de retorna não poderia ser um ponteiro para algum tipo senão sem tipo( isso mesmo void quer dizer sem tipo) por isso você deve ter se deparado com coisas assim:
ptr = (int*)malloc(sizeof(int)*n);
onde o `(int*)` é um casting, a lógica esta certa afinal se o seu ptr for do tipo int* nada errado com esse casting de um void* para int* – inclusive no meu post anterior eu uso isso – mas de fato ele é redundante porque a conversão é implicita, fica a seu cretério usa-lo ou não.
Agora um ponto importante sobre o malloc, porque o compilador não tem como saber qual é a quantia de memória a ser alocada – ela só é definida durante execução pelo usuario – ele não pode libera-la, por isso não se esqueça de usar a função free(), você só precisa passar o ponteiro que o malloc lhe deu para a função free() que ela se encarrega do resto:
free(ptr);
só mais uma coisa, não se esqueça do `#include <stdlib.h>` para poder usar a função ;D
Entry Filed under: C. .
Trackback this post | Subscribe to the comments via RSS Feed