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

Problemas ao alocar dinamicamente memoria de um ponteiro de ponteiros através de chamada de função

void alocaFantasma(int quantidadeFantasmas, int** fantasmas){
    fantasmas = malloc(sizeof(int**) * quantidadeFantasmas);
    for(int i = 0; i < quantidadeFantasmas; i++){
        fantasmas[i] = malloc(sizeof(int*) * 5);
    }
}

O codigo acima funcionava perfeitamente para alocar dinamicamente a memoria do array fantasmas[][] quando dentro do bloco da main(), mas quando transferi ela para uma função, a primeira vez que o programa tentou usar fantasmas[][] deu crash. Imagino que seja um problema na alocação, mas não sei qual o problema dessa chamada de função. A chamada está dessa forma na main():

alocaFantasma(quantidadeFantasmas, fantasmas);

A unica coisa que consequi pensar é que a função alocaFantasma aloca a memória para a variável existente dentro de seu escopo, e a fantasmas da main fica sem alocação, mas se tratando de ponteiros, não deveriam estar endereçados para o lugar certo? Preciso saber quais são as regras que estão atrapalhando o alocamento usando chamada de função, e como fazer para resolver esse alocamento dentro de uma chamada de função.

2 respostas
solução!

Olá Fabio, tudo bem?

Realmente o código assim não vai funcionar, porque não está sendo passado o endereço da variável fantasmas para a função alocaFantasma quando ela é chamada na main. Com isso, provavelmente, seria reportado um erro de acesso indevido a memória ao longo do programa. Mas já te dando uma dica, uma boa prática na programação em C, quando for fazer uma alocação de array ou matriz é comum a gente retornar o ponteiro do elemento alocado na funçao e atribuir ele em uma variável na main. Veja um exemplo de como fica esse seu programa fazendo dessa forma:

int** alocaFantasma(int quantidadeFantasmas){
    int** fantasmas = malloc(sizeof(int**) * quantidadeFantasmas);
    for(int i = 0; i < quantidadeFantasmas; i++){
        fantasmas[i] = malloc(sizeof(int*) * 5);
    }
    return fantasmas;
}

int main(){
    int qtd = 5;
    int** matriz = alocaFantasma(qtd);

    return 0;
}

Dessa forma feita ai, a matriz alocada na função é retornada e adicionada na variável matriz. Agora será possível fazer leitura e escrita em matriz dessa forma -> matriz[1][2]. Além disso, não se esqueça que sempre ao final da execução do programa é importante liberar toda a memória alocada para que o computador possa usar esse espaço de memória depois. Segue um exemplo de como ficaria a função para liberar a memória de matriz:

void liberaFantasma(int** matriz){
    for (int i = 0; i < 5; i++)
    {
        free(matriz[i]);
    }
    free(matriz);
}

E na main essa função pode ser chamada assim liberaFantasma(matriz);.

Espero ter ajudado, bons estudos!

Muito obrigado pela solução de boas práticas, é muito valioso aprender de forma correta.

No meu código descrito na verdade eu tentei alocar o espaço para a matriz fantasmas antes de carregar o mapa, consequentemente antes de fazer a leitura do mapa e descobrir a quantidade de fantasmas, gerando erro na alocação dinâmica. Descobri tentando aplicar o código que você me passou no mesmo lugar do código e vendo que continuava dando o mesmo erro.