malloc, struct e ponteiros

Re: malloc, struct e ponteiros

por Claynon Souza -
Número de respostas: 0

Tem o site do livro que está sendo usado pelo prof Coelho.

http://www.ime.usp.br/~pf/algoritmos/aulas/aloca.html

 

Não cheguei a ler essa parte de alocação então não sei se vai falar exatamente o que você quer saber (apesar de acreditar que sim) então vou tentar dar uma dica.

A função malloc recebe como parâmetro o número de bytes que você quer alocar. E a função sizeof recebe um "tipo" e retorna quantos bytes uma variável desse tipo ocupa. Então basta usar a função sizeof como argumento da função malloc. Ex:

pont = malloc(sizeof(int));

Nesse exemplo pont deve ser um ponteiro para inteiro. Se você tiver um ponteiro para char basta colocar char no lugar de int. O mesmo é feito para um struct, em vez de int você coloca o nome do struct. Para alocar um ponteiro de CelPixel basta fazer:

pontCel = malloc(sizeof(CelPixel));

Assim você não precisa se preocupar nas variáveis de um struct do tipo CelPixel.

 

Alocação de arrays são semelhantes. Um array é uma sequência de n variáveis de um tipo (digamos que seja CelPixel). Então precisamos alocar n vezes o número de bytes de CelPixel, basta fazer:

pontArray = malloc( n * sizeof(CelPixel));

Arrays de duas dimensões (matrizes) são bem parecidos também. Uma matriz é um array de arrays. Então precisamos primeiro alocar a memória do array maior e depois alocar a memória para esses arrays que estão dentro do array maior. Isso fica mais claro nos slides da aula 07. O código para alocação de uma matriz mxn é o seguinte:

pontMatriz = malloc( m * sizeof(CelPixel*));

for (i = 0; i < m; ++i)

    pontMatriz[i] = malloc( n * sizeof(CelPixel));

A primeira linha aloca a memória para o "array maior", é um array com os m arrays linhas. Depois temos que alocar a memória de cada um desses arrays linhas, cada um tem n CelPixel. Note que o primeiro malloc usamos ponteiro de CelPixel porque ele contém arrays (que "são ponteiros") enquanto nos mallocs de dentro do for usamos CelPixel porque esses array são arrays de CelPixel. Fica meio abstrato mas as imagens da aula 07 ajudam a entender.

 

Espero que não tenha sido muito abstrato e que ajude.