Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Duvida sobre matriz

Olá pessoal,

no exemplo temos:

// criando um ponteiro de ponteiro, ou seja, uma matriz
char** mapa;
int linhas;
int colunas;
...
void alocaMemMapa() {
    mapa = malloc(sizeof(char*) * linhas);
    for(int i = 0; i < linhas; i++) {
        mapa[i] = malloc(sizeof(char) * colunas + 1);
    }
}
...
}

Mas quando exatamente eu devo colocar "colunas + 1" ?

E porque no primeiro malloc eu uso char* e no malloc dentro do for eu uso apenas char ?

Obrigado.

5 respostas
solução!

E porque no primeiro malloc eu uso char* e no malloc dentro do for eu uso apenas char ?

Vamos por partes. Uma matriz é, basicamente, um vetor de vetores. Para acessar um vetor por ponteiros, você usa tipo*. Para acessar um vetor de vetores através de ponteiros, você usa tipo**. É um ponteiro de ponteiro .

Por isso mapa é char**.

Cada linha de mapa é um vetor de char, acessado através de um ponteiro do tipo char*. Por isso você diz que mapa tem o tamanho de sizeof(char*) * linhas.

Ou seja, cada ponteiro para linha da matriz tem o tamanho de um ponteiro char. Como temos linhas, então multiplicamos o tamanho de um ponteiro pela quantidade de linhas.

mapa[i] aponta para um vetor de valores do char, e não de ponteiros. Por isso precisamos saber o tamanho de um char, ao invés do tamanho do seu ponteiro.

Por isso o segundo for não tem asterisco para o malloc:

mapa[i] = malloc(sizeof(char) * colunas + 1);

Oi João,

Na linha:

mapa = malloc(sizeof(char*) * linhas);

Estamos alocando um espaço suficiente para guardar os ponteiros para char de acordo com a quantidade de linhas, isto é, aloca um espaço de memória suficiente para as linhas. Aqui usamos char * pois queremos espaço para guardamos um ponteiro.

Já na linha:

mapa[i] = malloc(sizeof(char) * colunas + 1);

Alocamos espaço para um array com a quantidade de posições igual a quantidade de colunas que temos. Aqui usamos char pois queremos espaço para guardar 1 caractere em cada posição.

Agora o + 1 desta linha é por conta do enter que é salvado pelo fscanf(). Se não tivéssemos este enter, não era necessário utilizar o + 1.

Ficou um pouco mais claro?

Abraço!

Então

mapa = malloc(sizeof(char*) * linhas);

Fazer isso é a mesma coisa que se eu estivesse criando um array certo ? ex:

char* linha1[]
char* linha2[]
char* linha3[]
char* linha4[]
char* linha5[]

E ao colocar char* eu estou dizendo que eu vou acessar estes endereços por meio de ponteiro de char ?

Sim, um array de char* alocado dinamicamente.

Veja se esse diagrama te ajuda:

char** mapa
  |
  |-> char* mapa[0]
  |    |-> char mapa[0][0]
  |    |-> char mapa[0][1]
  |    ...
  |    |-> char mapa[0][colunas - 1]
  |
  |-> char* mapa[1]
  |    |-> char mapa[1][0]
  |    |-> char mapa[1][1]
  |    ...
  |    |-> char mapa[1][colunas - 1]
  |
  |-> char* mapa[2]
  |    |-> char mapa[2][0]
  |    |-> char mapa[2][1]
  |    ...
  |    |-> char mapa[2][colunas - 1]
  |
  ...
  |-> char* mapa[linhas - 1]
       |-> char mapa[linhas - 1][0]
       |-> char mapa[linhas - 1][1]
       ...
       |-> char mapa[linhas - 1][colunas - 1]