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

Dúvida sobre curso de C part 3 (Aula 1, Atividade 7)

Olá, existe um fenômeno acontecendo no meu código e não consigo enxergar o motivo, se puderem me dar uma luz nisso eu agradeço kk... Estou usando o Dev C++ para compilar... Bom, a dúvida é nesse trecho do código:

int** v = (int**) malloc(sizeof(int) * 5);
    for(int i = 0; i < 5; i++) {
        v[i] = (int*) malloc(sizeof(int) * (10+1));
    }

Quando eu compilo esse código ele executa normalmente e imprime o mapa e tudo, porém quando eu deixo de somar o 10 com o 1 no sizeof o mapa do jogo não é imprimido.. Sei que somamos o +1 por causa do \n do fscanf() e tal mas eu não consigo enxergar o caminho que o compilador faz pra não aparecer mapa quando deixamos de somar 10+1. Por quê? T.T

Outra dúvida minha, aproveitando o post, somente somamos com +1 em caso de passarmos uma string como máscara? Se for qualquer outro tipo não preciso somar com +1?

Código completo:

char mapa[5][10+1];
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);
    printf("linhas %d colunas %d\n", linhas, colunas);

    int** v = (int**) malloc(sizeof(int) * 5);
    for(int i = 0; i < 5; i++) {
        v[i] = (int*) malloc(sizeof(int) * (10+1));
    }
    v[0][0] = 10;
    v[1][2] = 12;
    printf("inteiro alocado %d %d\n", v[0][0], v[1][2]);

    for(int i = 0; i < 5; i++) {
        free(v[i]);
    }
    free(v);

    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);

}
2 respostas
solução!

Olá Icaro. Somente consegui reproduzir a situação que você explicou deixando de multiplicar pelo 10+1 e o código ficando como mostrado abaixo.

    int** v = (int**) malloc(sizeof(int) * 5);
    for(int i = 0; i < 5; i++) {
        v[i] = (int*) malloc(sizeof(int));
    }

Nesse caso o mapa não é impresso porque nas linhas seguintes é atribuído valor a uma posição que não existe na matriz v[1][2] = 12; travando o programa na linha que você utiliza a função free(v[i]); e dessa maneira não imprimindo o mapa.

v[0][0] = 10;
v[1][2] = 12;
printf("inteiro alocado %d %d\n", v[0][0], v[1][2]);

Mas não tenho certeza se é esse o seu caso, então se puder mostrar exatamente como está seu código quando apresenta a duvida.

Agora falando sobre o +1, como você disse ele vai ficar restrito as strings mesmo, porque toda a string precisa de um char no final que vai sinalizar que ela acabou, por exemplo o nome Icaro tem 5 letras, mas para guarda-lo vamos precisar de um vetor de tamanho 5+1 e dentro dele ficara contido o 5 caracteres do nome e mais o \0 que indica o fim da string ( "I c a r o \0").

Espero ter ajudado, qualquer duvida estou a disposição. Abraço.

Oi Igor, então, é que nem lembro mais como tava meu código kkk.. Esse post eu fiz faz 1 semana já.. Mas eu entendi o que você quis dizer e provavelmente deve ter sido isso mesmo. E muito obrigado por esclarecer a dúvida sobre somente ser em caso de strings que a gente deve fazer a soma.

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