1
resposta

[Dúvida] [Error] Invalid Conversion from 'void' to 'char**' [-fpermissive]

Boa noite pessoal. Fiz o código conforme o vídeo-aula, porém, aqui no compilador do DEV C++ está acusando o erro do título em 2 linhas (22 e 24).

Código Completo:

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

// Global
char** mapa;
int linhas;
int colunas;

int main() {
    
    FILE* f;
    f = fopen("mapa2.txt", "r");
    if(f == 0) {
        printf("Erro na leitura do mapa.txt.\n");
        exit(1);
    }
    
    fscanf(f, "%d %d\n", &linhas, &colunas);
    printf("Linhas %d Colunas %d\n", linhas, colunas);
    
    // 'Malloc' é usado para alocar memória dinâmicamente.
    mapa = malloc(sizeof(char*) * linhas);
    for(int i = 0; i < linhas; i++) {
        mapa[i] = malloc(sizeof(char) * (colunas+1));	
    }
    
    for(int i = 0; i < 5; i++) {
        fscanf(f, "%s", mapa[i]);
    }
    
    for(int i = 0; i < 5; i++) {
        printf("%s\n", mapa[i]);
    }
    
    fclose(f);
    
    for(int i = 0; i < linhas; i++) {
        free(mapa[i]);
    }
    
    free(mapa);
}

Meu mapa2.txt:

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

Linha 22 acusando o Erro: Invalid Conversion from 'void' to 'char**' [-fpermissive]:

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

Linha 24 acusando o Erro: Invalid Conversion from 'void' to 'char*' [-fpermissive]:

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

Lendo alguns tópicos aqui do fórum, vejo que pra 'solucionar' o caso precisaria acrescentar antes dos mallocs: mapa = (char**)malloc ... mapa = (char*)malloc ...

Porém, o porquê disso? Não entendi o motivo. Por acaso o compilador não está encontrando algo da memória ou então, não está conseguindo gravar na memória? Ou seria outra definição?

Aguardo resposta, obrigado.

1 resposta

Olá, Patrick!

No seu código, você está tentando alocar memória dinamicamente para a variável mapa, que é um ponteiro para um ponteiro de caracteres (char**). No entanto, o compilador está acusando um erro de conversão inválida de void para char** na linha 22 e de void para char* na linha 24.

Para corrigir esse erro, você precisa fazer um cast do retorno da função malloc() para o tipo correto. No caso, você precisa fazer um cast para (char**) na linha 22 e para (char*) na linha 24.

O motivo pelo qual é necessário fazer esse cast é que a função malloc() retorna um ponteiro genérico (void*). Ao fazer o cast para o tipo correto, você está informando ao compilador o tipo de dado que será armazenado naquela região de memória alocada.

Espero ter ajudado! Bons estudos!