1
resposta

erro na alocacao

estou fazendo um codigo a parte do professor pra tentar aprender, só q estou com um problema, fiz uns teste na depuracao e vi que minha matriz nao esta alocando corretamente, por isso quando tento acessar o pedaço dela pra fazer o pacman se mover, da um erro de acesso indevido a memoria, mas nao faço ideia do que eu esteja fazendo errado, alguem consegui me ajudar? Codigo:

#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<errno.h>
#define limpaBuf while(getchar()!='\n');

char **mapa;

FILE* abriArquivo(char* nomeDoArquivo, char*modoDeAAb){

    FILE*f = fopen(nomeDoArquivo, modoDeAAb);
    if(f==NULL){
        printf("arquivo errado ou inexistente, ERRO: %s", strerror(errno));
        exit(1);
    }
    return f;
}
void aumentaMatriz(int colunas, int linhas){
    mapa = malloc(sizeof(char)*linhas);
    for(int i =0; i<linhas; i++){

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

    }
}
void preencheMapa(FILE *f, int tamanho, char *map){

    for(int i = 0; i<tamanho; i++){
        *(map+i) = fgetc(f);
    }
}
void imprimeMat(char *map, int tamanho){
    for(int i = 0; i<tamanho; i++){
        printf("%c", *(map+i));
    }
}
void liberaMapa(int linhas){
    for(int i = 0; i<linhas; i++){
        free(mapa[i]);
    }
}
void movaPersonagem(int *linhaPersonagem, int *colunaPersonagem, char acao){
    if(acao == 'a'){
        mapa[(*linhaPersonagem)][(*colunaPersonagem)]='.';
        --*colunaPersonagem;
    }else
        if(acao == 'd'){
            mapa[(*linhaPersonagem)][(*colunaPersonagem)]='.';
            ++*colunaPersonagem;
        }else
            if(acao == 'w'){
                mapa[(*linhaPersonagem)][(*colunaPersonagem)]='.';
                ++*linhaPersonagem;
            }else
                if(acao == 's'){
                    mapa[(*linhaPersonagem)][(*colunaPersonagem)]='.';
                    --*linhaPersonagem;
                }
    mapa[(*linhaPersonagem)][(*colunaPersonagem)]='@';
}
int main(){
    int colunas, linhas, linhaPerso, colunaPerso;
    char Acao = 27;
    FILE *f;
    f = abriArquivo("mapa.txt", "r");

    fscanf(f, "%d %d %d %d ", &linhas, &colunas, &linhaPerso, &colunaPerso);
    aumentaMatriz(colunas, linhas);
    printf("%d\n", sizeof(mapa));
    preencheMapa(f, linhas*colunas, &mapa);
    do{

        if(Acao != 27){

            movaPersonagem(&linhaPerso, &colunaPerso, Acao);

        }

        imprimeMat(&mapa, linhas*colunas);
        Acao = getchar();
        limpaBuf;
    }while(Acao!=27);
    return 0;
}

mapa:

5 12 2 6 
|--------|
|....@...|
|--..||..|
|........|
|--------|  ****
1 resposta

Olá Vitor!

Pelo código que você compartilhou, parece que o problema está na alocação da matriz. Você está alocando espaço apenas para um vetor de caracteres em vez de um vetor de ponteiros para caracteres. Isso faz com que a matriz não seja alocada corretamente e cause erros de acesso à memória.

Para corrigir isso, você precisa alocar espaço para um vetor de ponteiros para caracteres. Além disso, você também precisa alocar espaço para cada linha da matriz. Aqui está a correção no código da função aumentaMatriz():

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

Com essa correção, a matriz será alocada corretamente e você não terá mais erros de acesso à memória.

Espero que isso resolva o seu problema! Se tiver mais alguma dúvida, é só me dizer. Espero ter ajudado e bons estudos!

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