- Matrizes Dinâmicas são feitas utilizando ponteiros de ponteiros
int **m = NULL;
int nrows = 2;
int ncols = 3;
m = calloc(nrows, sizeof(int*));
for(int i=0; i < nrows; i++) {
m[i] = calloc(ncols, sizeof(int));
}
Linha | Memóra | Variável | Valor |
---|---|---|---|
Memória | Stack | ||
1 | 0x0 | **m | NULL |
2 | 0x8 | nrows | 2 |
3 | 0x12 | ncols | 3 |
4 | 0x0 | **m | 0h0 |
5 | 0x16 | i | 0 |
7 | 0x16 | i | 1 |
9 | 0x16 | i | 2 |
Memória | Heap | ||
4 | 0h0 | *m[0] | NULL |
4 | 0h8 | *m[1] | NULL |
6 | 0h0 | *m[0] | 0h16 |
6 | 0h16 | m[0][0] | 0 |
6 | 0h20 | m[0][1] | 0 |
6 | 0h24 | m[0][2] | 0 |
8 | 0h8 | *m[1] | 0h28 |
8 | 0h28 | m[1][0] | 0 |
8 | 0h32 | m[1][1] | 0 |
8 | 0h36 | m[1][2] | 0 |
- Note que se a matriz é um ponteiro de ponteiro de inteiro, ela deve receber o endereço do tipo ponteiros de inteiros
- Na sequência, para cada linha (nrows), é alocado um endereço do tipo inteiro, sendo que é este que irá receber o valor que iremos armazenar na matriz e sua quantidade é dada pela quantidade de colunas (ncols)
A matriz possui linhas e colunas, cada linha conterá um "vetor" e como sabemos um vetor dinâmico é criado a partir de um ponteiro, a quantidade de casas que esse vetor conterá é dada pela quantidade de colunas (ncols)
#include <stdio.h>
#include <stdlib.h>
void print_matriz(int **m, int len){
for(int i=0; i < len; i++){
printf("&m[%d]: %p | m[%d]: %p \n",i, &m[i], i, m[i]);
}
puts("");
}
void print_values_matriz(int **m, int nrows, int ncols){
for(int i=0; i < nrows; i++)
for(int j=0; j < ncols; j++)
printf("&m[%d][%d]: %p | m[%d][%d]: %d \n",i, j, &m[i][j], i, j, m[i][j]);
puts("");
}
void free_matriz(int** *m, int nrows) {
int **aux = *m;
for(int i=0; i < nrows; i++){
free(aux[i]);
}
free(aux);
*m = NULL;
}
int main() {
int **m = NULL;
int nrows = 2;
int ncols = 3;
m = calloc(nrows, sizeof(int*));
printf("&m: %p | m: %p \n\n", &m, m);
for(int i=0; i < nrows; i++) {
m[i] = calloc(ncols, sizeof(int));
}
print_matriz(m, nrows);
for(int i=0; i < nrows; i++) {
for(int j=0; j < ncols; j++)
m[i][j] = (i+j)*10;
}
print_values_matriz(m, nrows, ncols);
free_matriz(&m, nrows);
return 0;
}