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

Variáveis e endereços de memória.

Boa tarde, estou com uma pequena duvida. No código a seguir( EDIT1 :Editei pois tinha digitado o printf() fora do for):

for(int i =0 ; i<10 ; i++){
    int c = 0;
    printf("%d\n", &c);
}

EDIT 2{ Este e o resultado do printf, com os enderecos.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade}

A declaração da variavel e feita dentro do laço for. Quando peço o endereço, ele da o mesmo endereço de memoria. A duvida é: como ocorre a criação da variavel c. Ela cria c toda iteração no mesmo endereço de memoria? Ou o compilador entende que é a mesma variavel e apenas atribui o valor 0 a cada iteração?

4 respostas

Olá,

Ele cria e destroi a variável c a cada interação. Ele faz isso com tudo que está dentro do escopo dos parenteses.

Quando vc manda imprimir o endereço de memoria de "c" fora do "for" , vc está mostrando na tela na verdade uma informação que chamamos de Lixo , porque "c" fora do escopo do "for" não existe.

Na verdade da forma que vc fez o compilados nem compila ele da uma mensagem de erro.

Não sei bem o que vc quer fazer, mas é errado vc acessar a variável da forma que esta fazendo.

Desculpe a confusão, havia digitado o printf fora do for, agora arrumei. Mas na verdade estava usando a variável c para checar condições. Como ela aparecia em varias funções localmente, nesta função especifica eu tinha esquecido de declara-la e , quando recebi a mensagem de erro, declarei ela onde estava sendo usada mesmo. Depois da declaração de c no meu código existe um outro for, e c estava naquela posição pois precisava que o valor dele iniciasse em 0 toda nova iteração i.

solução!

Olá,

Agora entendi, bom quanto a sua dúvida.

Tudo que é instanciado dentro de um escopo { }, pode ser um for, um if ou while, quando o escopo termina o que foi criado é liberado.

No seu exemplo, as variáveis C** e **I só exitem dentro do escopo do for. E o C é criado e liberado a cada interação.

Se uma variável não é utilizada fora do escopo é sempre melhor declara-la dentro do escopo, para que o compildor se encarregue de alocar e liberar a memoria.

Isso não vale para a memoria que você aloca manualmente, nesse caso é vc quem tem que alocar e desalocar, mesmo dentro de um escopo, se não vc cria um caso de vazamente de memoria.

Quanto ao fato de no seu exemplo ele pegar sempre o mesmo endereço de memoria ai o lance é mais sobre como o compilador gerou o assembly do teu código.

O compilador é inteligente para fazer otimizações e ele vai fazer o teu executável otimizar essa questão pegando sempre o mesmo endereço de memória, porque o programa é pequeno e simples.

Mas o fato de ele pegar sempre o mesmo endereço é por conta do Copilador que vc está usando, o quanto ele está setado para otimizar e do que o teu código está fazendo.

Você pode fazer o disassembly do executável de compiladores diferentes e ver o que eles fazem de diferente com o mesmo código.

Resuindo todo esse bla-bla-bla, é SIM, ele pega o mesmo endereço de memoria para ESTE caso, mas isso NÃO É UMA REGRA.

Muito obrigado pela ajuda! Esclareceu bem a minha duvida. Vou aproveitar os ganchos e pesquisar mais sobre o disassembly do executavel e vazamentos de memoria.