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(); }