Alocação dinâmica de memória em matrizes em C

Uma matriz de tamanho dinâmico em C é implantada a partir de vetores contidos em vetores. Exemplificando, uma matriz 2x3 teria em cada uma das duas linhas, um vetor de 3 posições formando assim três colunas.

Sendo declarada como um ponteiro de ponteiro (por exemplo, int **matriz), para a sua alocação é necessário a alocação de um vetor comum e com o auxílio de uma função de repetição, como o for, criar um novo vetor dentro do primeiro. Como se pode ver no código abaixo:

...

//matriz é alocada como vetor tendo um tamanho m
matriz = (int*) malloc(m * sizeof(int*));
       
        for(i = 0;i < m;i++){
/*Nesta etapa é alocado outro vetor dentro da posição i,fazendo desta maneira n colunas*/
               matriz[i] = (int*) malloc (n*sizeof (int*));
  •         A utilização de um dado dessa matriz seria por matriz[i][j].
  •         m e n são números inteiros que indicarão – quando multiplicados nesse caso pelo tamanho de um int –  quantos bytes serão alocados.
Abaixo você consegue ver um programa que fiz que aloca dinamicamente uma matriz:

/*
Escrito por iojoaomarcos :v
v. 1.2
Programa que cria uma matriz de tamanho dinâmico
e exibe seu conteúdo na tela.
*/
#include <stdio.h>
#include <stdlib.h>
int main() {
int **matriz; /*Matriz que será alocada dinamicamente
(declarada como ponteiro de ponteiro)*/
int m, n; //Dimensões da Matriz
int i, j; //Contadores
printf("Digite as dimensoes da Matriz: ");
scanf("%i %i", &m, &n);
//Abaixo, a matriz é inicialmente alocada como um vetor
matriz = (int*) malloc(m * sizeof(int*));
for(i = 0;i < m;i++){
/*Nesta etapa é alocado outro vetor dentro da posição i,
fazendo desta maneira colunas*/
matriz[i] = (int*) malloc (n*sizeof (int*));
for(j=0; j < n; j++){
printf("Digite o elemento da posicao %i x %i: ",i+1,j+1);
scanf("%i",&matriz[i][j]);
}
}
//Exibindo na tela...
printf("\n\n\nOs numeros digitados foram:\n");
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
printf("\nO elemento %i x %i e: %i", i+1, j+1, matriz[i][j]);
}
}
free(matriz); //Libera a memoria
matriz = NULL; //"Limpa" a memoria
return 0;
}

Esse texto foi originalmente requisitado na disciplina Programação de Computadores do meu curso de Eng. de Computação :v

Comentários

Postagens mais visitadas deste blog

Parli Italiano? III- Alfabeto Italiano

Vogal ou Consoante com Switch-Case em C

União de dois vetores e intermediários de um vetor