Título: Matrizes Dinâmicas
Linguagem: C/C++
S.O.: DOS/Windows
Autor(es): Wenderson Teixeira
Em se tratando de ponteiros e matrizes em C, sempre há uma certa confusão
sobre o que se pode e que não se pode fazer, uma coisa muito comum, é querer
se alocar uma matriz de forma dinâmica, com tamanho variável, e que possa ser
alterado durante a execução.
A linguagem C, permite que você crie matrizes estaticamente, com n dimensões
de forma simples, ex.:
int array[5][10][20];
Mas como fazê-lo de forma dinâmica?
Pois bem, primeiro deve-se criar um pointeiro para o tipo de dado que se vai
utilizar, contendo a mesma quantidade de indireções que as dimensões da matriz
que se deseja, por exexmplo, se for utilizar-se uma matriz bidimensional de
inteiros, então deve-se criar um ponteiro de ponteiro:
int **array;
Deve-se alocar então, os ponteiros das linhas e depois cada linha, uma por vez:
array = (int **)maloc(sizeof(int *) * 10); for(c = 0; c < 10; c++) array[c] = (int *)malloc(sizeof(int) * 20);
Para se desalocar, deve-se então fazer o contrário, desalocar primeiro as linhas, e por fim os ponteiros das linhas:
for(c = 0; c < 10; c++)
if(array[c])
free(array[c]);
if(array)
free(array);
Agora, tendo isto em mente, vamos elaborar então duas rotinas, uma para criar e outra para apagar uma matriz bidimensional de inteiros, e logo em seguida, demonstrar a sua utilização:
dynarray.c
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
/* Prototipos das funcoes ***************************************************/
int **CreateArray(int c, int l);
void DeleteArray(int **array, int l);
/* Implementacao ************************************************************/
/* CreateArray */
int **CreateArray(int c, int l)
{
int cy;
int **array;
array = (int **)malloc(sizeof(int *) * l);
if(!array)
return 0;
for(cy = 0; cy < l; cy++)
{
array[cy] = (int *)malloc(sizeof(int) * c);
if(!array[cy])
{
DeleteArray(array, cy);
return 0;
}
}
return array;
}
/* DeleteArray */
void DeleteArray(int **array, int l)
{
int cy;
for(cy = 0; cy < l; cy++)
if(array[cy])
free(array[cy]);
if(array)
free(array);
}
/****************************************************************************/
/* Funcao principal */
void main()
{
int **array;
int c, l;
int sc = 5, sl = 100;
/* Cria uma matriz com tamanho sc x sl */
array = CreateArray(sc, sl);
if(!array)
{
printf("Erro de alocação de memória!");
return;
}
/* Preenche a matriz com valores */
for(l = 0; l < sl; l++)
for(c = 0; c < sc; c++)
array[l][c] = c;
/* Imprime a matriz para mostrar que funcionou */
for(c = 0; c < sc; c++)
printf("\t[%d]", c);
for(l = 0; l < sl; l++)
{
printf("\n[%d]", l);
for(c = 0; c < sc; c++)
printf("\t%3d", array[l][c]);
}
/* Apaga a matriz */
DeleteArray(array, sl);
getch();
}