Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Código compila mas o programa não imprime o mapa

Escrevi o seguinte código:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char** mapa;
    int linhas;
    int colunas;

    FILE* f;
    f=fopen("mapa.txt", "r");
    if(f==0) {
        printf("Erro ao abrir o arquivo de mapas.");
        exit(1);
    }

    fscanf(f, "%d %d", &linhas, &colunas);
    printf("O mapa tem %d linhas e %d colunas!\n", linhas, colunas);

    mapa = malloc(sizeof(char*) * linhas);
    for(int i=0; i<linhas; i++) {
        mapa[i] = malloc(sizeof(char) * (11));
    }

    for(int i=0; i<linhas; i++) {
        fscanf(f, "%s", &mapa[i]);
    }

    for(int i=0; i<linhas; i++) {
        printf("%s\n", mapa[i]);
    }

    fclose(f);

    for(int i=0; i<linhas; i++) {
        free(mapa[i]);
    }
    free(mapa);

}

O código foi compilado sem nenhum problema. Mas, ao executá-lo, foi impresso somente a frase indicando o número de linhas e colunas. O mapa não foi impresso. Resolvi escrever um código mais simples para testar a criação de arranjos com o "malloc":

#include <stdio.h>
#include <stdlib.h>

int main() {

    int* v = malloc(sizeof(int)*4);

    v[0]=10;
    v[1]=11;
    v[2]=12;
    v[3]=13;

    free(v);
    printf("%d\n%d\n%d\n%d", v[0], v[1], v[2], v[3]);

}

Depois de compilar e executar, as variáveis v[0] e v[1] imprimiram números aleatórios, já as variáveis v[2] e v[3] imprimiram os números 12 e 13, respectivamente, como esperado. Gostaria de saber o que está acontecendo de errado ao declarar os valores para as variáveis v[0] e v[1], bem como solucionar o problema de não imprimir o mapa no programa do jogo. Obrigado!

4 respostas

No código de cima na linha "mapa = malloc(sizeof(char) * linhas)" troca ela por "mapa = (char**)malloc(sizeof(char) * linhas)", para mudar o tipo de retorno do malloc e no código de baixo escreve o free(v) depois do printf.

Obrigado pela resposta. No código de baixo o problema foi solucionado. Quer dizer que só posso liberar o espaço de memória alocado depois tê-lo utilizado? Pensei que só fossem liberados os espaços onde não foram gravadas informações. No código de cima (foge-foge) a solução não funcionou. A saída continua sendo somente a frase indicando o número de linhas e colunas do mapa. Após isso o programa fica "parado" por +- um segundo e termina. Vi nos outros tópicos que poderia ser mesmo o tipo de retorno do malloc e que por isso o programa estaria travando e terminando, mas não consegui corrigir da maneira indicada...

for(int i=0; i<linhas; i++) { fscanf(f, "%s", &mapa[i]); }

Nesse for aqui tira esse & pois mapa[i] é em ponteiro que guarda um endereço então você tá dando o endereço do ponteiro não o endereço que está no ponteiro. Também mantém a alteração da linha do malloc.

Deu certo, agora está imprimindo o mapa. Muito obrigado, Augusto. Porém, fica uma dúvida, por que o erro só apareceu quando usei o malloc? Quando defini o tamanho da matriz "mapa" com 5 linhas e 10 colunas, eu usei o "&" no fscanf e não teve problema nenhum. Quando eu alterei declaração de "mapa" usando o malloc que começou a travar. Fica também a sugestão de alertar a respeito desse detalhe no vídeo da aula 04 "Salvando e lendo dados de uma matriz", onde o professor não coloca esse "&" sem fazer nenhuma observação sobre esse detalhe. Obrigado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software