Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro na alocação de memória da matriz 'mapa'

Estou com o código igual ao do professor, porém ainda assim venho apresentando erros.

Arquivo 'mapa.txt'

5 10
|--------|
|...|..-.|
|..-|.@..|
|......-.|
|--------|

Código

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


char** mapa; /*O +1 é para considerar o \0*/
int linhas;
int colunas;

int main(){
    
    FILE* f;
    f = fopen("mapa.txt", "r");
    
    if(f==0){
        printf("Erro na leitura do mapa\n");
        exit(1); 
    }
    
    fscanf(f,"%d %d", &linhas, &colunas);
    
    mapa = malloc(sizeof(char*) * linhas);
    
    for(int i=0;i<linhas;i++){
        mapa[i] = malloc(sizeof(char) * (colunas+1));
    }
    
    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);
}

Erros

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

linha 21 → mapa = malloc(sizeof(char*) * linhas); linha 24 → mapa[i] = malloc(sizeof(char) * (colunas+1));

Poderiam me apontar o que fazer para solucionar esses erros ?

1 resposta
solução!

Boa tarde, Lorena! Tudo bem?

Testei o seu código usando a IDE CLion e antes de compilar o código já acusou um erro.

O erro é "Assigning to 'char **' from incompatible type 'void *'" significa que você está tentando atribuir um valor do tipo void * para uma variável do tipo char **, e o compilador não consegue fazer essa conversão implicitamente.

Em C, a função malloc retorna um ponteiro do tipo void *, que é um ponteiro genérico. Para corrigir esse erro, você precisa fazer um casting explícito do retorno de malloc para o tipo apropriado, que neste caso é char ** para a alocação da matriz de ponteiros e char * para cada linha da matriz.

Veja como corrigir o código:

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

char** mapa; /*O +1 é para considerar o \0*/
int linhas;
int colunas;

int main(){
    FILE* f;
    f = fopen("mapa.txt", "r");

    if(f==0){
        printf("Erro na leitura do mapa\n");
        exit(1);
    }

    fscanf(f, "%d %d", &linhas, &colunas);

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

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

    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);
    
    return 0;
}

Com essas mudanças, o código deve compilar sem erros relacionados ao tipo de ponteiro.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.