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

Problemas com alocação dinâmica de memória em um array bidimensional (Aula 1 - Atividade 7)

Olá, pessoal. Estou com alguns problemas para fazer a alocação dinâmica de memória com um array bidimensional de char, referente a atividade 7 da aula 1. Utilizo a IDE Visual Studio C++ para desenvolver as atividades. O código encontra-se abaixo.

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

char** mapa;
int linhas = 0;
int colunas = 0;

int main() {

    setlocale(LC_ALL, "en-US");

    FILE* f;
    errno_t err;
    err = fopen_s(&f, "mapa.txt", "r");

    if (f == 0) {

        printf("Erro na leitura do mapa\n");
        exit(1);

    }

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

    // printf("linhas = %d colunas = %d", linhas, colunas);

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

    for (int i = 0; i < linhas; i++) {

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

    }

}

Esses são os "warnings" apresentados:

Gravidade Código Descrição

Aviso C6011 Desreferenciando ponteiro NULL "mapa".

Aviso C6386 Saturação do buffer durante a escrita de "mapa": o tamanho gravável é de "sizeof(char )linhas" bytes, porém "16" bytes podem ter sido escritos.

Aviso C26451 Estouro aritmético: usando o operador '+' em um valor de byte 4 e, em seguida, convertendo o resultado em um valor de byte 8. Converta o valor no tipo mais amplo antes de chamar o operador '+' para evitar estouro (io.2).

A sensação que tenho é que o compilador não reconhece o char** mapa como um array. Já tentei utilizar uma variável auxiliar pointer para char "pAux" para receber a alocação no laço for, e então copiá-los para "mapa" via memcpy, mas ele não consegue realizar a cópia.

Caso alguém possa me ajudar, serei grato.

2 respostas

olha eu nao sei muito bem te ajudar mais eu quando estou usando o c++ eu nao utilizo o malloc ele fica dando errinhos sobre o buffer e tals ai eu uso o new:

char** mapa = new char*[Linhas];
for(int i = 0; i < Linhas; i++){
        mapa[i] = new char[Colunas];
}        
//tambem tem que liberar a memoria
for(int i = 0; i < Linhas; i++){
        delete[] mapa[i];
}
delete[] mapa;

E isso tomara que ajude

solução!

Boa noite, Vinicius. Obrigado pela resposta. Acabei resolvendo o problema ao trocar de IDE. Por alguma razão (que ainda desconheço), o Visual Studio C++ dava essas warnings na compilação do trecho abaixo:

    for (int i = 0; i < linhas; i++) {

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

        // Aviso C6011 Desreferenciando ponteiro NULL "mapa".

    }

Como eu tinha uma outra IDE, o Visual Studio Code, rodei o mesmo programa e funcionou normalmente. Estou utilizando o compilador em C mesmo, não em C++. Agradeço novamente sua ajuda, saúde 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