aula 202

Como alocar uma matriz dinâmica em C?

Continuando o estudo sobre ponteiros e alocação dinâmica de memória aqui no nosso Curso de Programação C, vamos aprender nesta aula como alocar uma matriz dinâmica em C.

Para entender como alocar uma matriz dinâmica em C é fundamental que você tenha entendido como alocar um vetor dinâmico em C. Se tiver qualquer dúvida reveja a aula 199 sobre alocação dinâmica de vetor, e caso as dúvidas persistam, use o espaço para comentários.

Uma matriz dinâmica é um vetor de vetores!

Matrizes Dinâmicas
Representação de uma matriz dinâmica.

Como pode ser visto na imagem acima, uma matriz dinâmica é um vetor de vetores. Neste caso, nossa variável mat será uma variável do tipo ponteiro para ponteiro. Inicialmente alocamos dinamicamente um vetor, que pode ser representado como a coluna à esquerda na figura acima. Esse vetor armazenará o endereço de outros vetores, neste caso, as linhas da nossa matriz.

Como estamos falando de alocação dinâmica de memória, cada etapa precisa ser feita com bastante atenção. Primeiro alocamos um vetor. Seu tamanho deve ser a quantidade de linhas que precisamos na matriz, assim:

    // alocação de um vetor de tamanho 4 (4 linhas)
    int **mat, i;
    mat = malloc(4 * sizeof(int*));

Agora que temos um vetor, para cada posição deste vetor precisamos alocar outro vetor. Cada novo vetor será uma linha da nossa matriz, assim:

    // alocação das linhas da matriz com tamanho 3 (3 colunas)
    for(i = 0; i < 4; i++)
        mat[i] = malloc(3 * sizeof(int));

O fato de nossa matriz ter sido alocada dinamicamente não altera em nada seu funcionamento. Ela continua sendo acessada por meio de dois índices, um para linha e outro para coluna, como apresentado no código de exemplo abaixo.

Código de exemplo completo em C para alocar uma matriz dinâmica

/*
            Aula 202: Como alocar uma matriz dinâmica?

            Código escrito por Wagner Gaspar
            Junho de 2021

            vetor de vetores -> int* -> 10 27 32
                                int* -> 11 75 49
                                int* -> 43 82 10
                                int* -> 12 47 62
*/


int main(){

    int **mat, i, j;

    // aloca um vetor de ponteiros para inteiros
    mat = malloc(4 * sizeof(int*));


    // cada posição do vetor aponta para outro vetor
    for(i = 0; i < 4; i++)
        mat[i] = malloc(3 * sizeof(int));

    srand(time(NULL));


    // gera números aleatórios para preencher a matriz
    for(i = 0; i < 4; i++){
        for(j = 0; j < 3; j++)
            mat[i][j] = rand() % 100;
    }


    // imprime a matriz
    for(i = 0; i < 4; i++){
        for(j = 0; j < 3; j++)
            printf("%d ", mat[i][j]);
        printf("\n");
    }

    return 0;
}

Deixe um comentário

4 × cinco =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.