9
respostas

Comportamento de arrays em C

Logo no terceiro vídeo do curso na hora de criar o array que guardara o mapa o professor declara ele da seguinte maneira:

mapa[5][10+1]

Para experimentar fiz a declaração assim:

mapa[5][10]

E meu output do mapa foi o seguinte:

|--------||...|..-.||..-|.@..||......_.||--------|
|...|..-.||..-|.@..||......_.||--------|
|..-|.@..||......_.||--------|
|......_.||--------|
|--------|

A minha dúvida é em relação ao comportamento deste array e da memória que ele consome. Pois pelo que eu havia entendido cada "linha" da matriz poderia guardar apenas 10 chars e caso houvessem mais o código quebraria. Porque isso acontece?

É pelo fato das posições da matriz não serem salvas de maneira sequencial na memória? Ou existe algum outro fator?

9 respostas

Olá Brunno tudo bem?

Então isso acontece sim, se você criar uma matriz com 10 posições na "linha" ele irá reservar a memória para 10 posições se você tentar inserir qualquer informação fora do espaço reservado pela memória na criação seu código vai quebrar,

Isso é por falta de memória?

Não, você pode ter memória de sobra em seu computador, porém o que reservou foi 10 espaços e em tempo de execução ele irá reservar este espaço para você na memória,

Espero ter ajudado e bons estudos,

Atenciosamente,

Renan Lopes

Oi Renan, ajudou sim. Mas ainda não entendi como a posiçào mapa[0] consegue guardar o mapa todo, sendo que em teoria ele deveria poder comportar apenas 10 chars. Você sabe me dizer a razão?

Olá, Brunno!

Em mapa[0] você não tem todos os dados do mapa. Você tem apenas a primeira linha.

Oi Carlos,

Realmente não faz sentido você ter todo o mapa em mapa[0], mas quando ao final do código eu passo o comando:

printf("%s", mapa[0]);

O que o programa me devolve é:

|--------||...|..-.||..-|.@..||......_.||--------|

Por isso a minha pergunta. Gostaria de entender melhor a razão.

Abs, Brunno

Eu to sem PC agora pra poder dar uma atenção maior, mas faz isso, por favor: Posta aqui o código que preenche essa matriz?

Porque em C você consegue atribuir valores a um array fora de seu limite sem nenhuma mensagem de erro.

Acredito que o erro esteja no preenchimento da matriz, e que todo este conteúdo realmente esteja na posição 0.

Olá Brunno tudo bem?

Poderia postar o código para melhor análise??

Atenciosamente,

Renan Lopes

Desculpe a demora para postar aqui, segue o codigo:

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

char mapa[5][10];
int linhas;
int colunas;

int main () {
    // matriz de 5x10


    FILE* f;
    f = fopen("map1.txt", "r");
    if (f == 0) {
        printf("Erro na leitura do mapa.\n");
        exit(1);
    }

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

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

}

Como eu havia falado, sei que a declaracao correta de mapa e "mapa[5][10+1]", apenas nao entendi porque o programa tem este comportamento quando declarado com apenas 10 espacos na "linha".

Não sei se entendi bem seu problema Brunno, porém caso você esteja se referindo ao fato de ter definido um ARRAY com cinco posições e ter usado mais que essas cinco e mesmo assim o seu programa não quebrou, acontece o seguinte, quando você declara um ARRAY de cinco posições, o compilador está reservando aquele espaço de memória pra você. Caso você tente usar um espaço de memória fora do intervalo desse ARRAY, não quer dizer que obrigatoriamente seu programa irá quebrar. Você irá estar acessando uma posição de memória que não pertence a sua alocação definida inicialmente, e com isso essa posição pode possuir lixo de outros programas que a usaram anteriormente ou, caso esteja sendo realmente uma posição de memória que esteja sendo usada por alguma aplicação você terá o famoso erro de ACESS VIOLATED (AD). É errado e pode causar sérios problemas você usar posições que não estão alocadas para sua aplicação, C é uma linguagem bastante poderosa e nos permite ter muita flexibilidade ao desenvolver, porém temos que ter cuidado em dobro também, como dizia tio Ben: Com grandes poderes vem grandes responsabilidades.

Posso ter me equivocado em alguma parte pois também estou iniciando minha jornada em C, caso eu esteja errado me corrijam.

Abraços