Ir ao conteúdo
  • Cadastre-se
vitorrtonon

Memória Stack

Recommended Posts

Olá, boa tarde!

Eu tenho uma dúvida a respeito da disposição da região de memória armazenada pelas variáveis de meu programa.

Nós sabemos que as variáveis são "empilhadas" na memória Stack a medida que aparecem no programa.

Da mesma forma, sabemos que a região do topo da pilha tem sempre menor posição de memória que um elemento mais no seu "fundo".

Por exemplo, se eu tenho o seguinte trecho de código:

int main (int argc, char *argv[])

{

int a;

char b;

printf("Endereco de a: %p\n", &a);

printf("Endereco de b: %p\n", &B);

return 0;

}

Em uma execução, tenho a seguinte saída:

Endereco de a: 0xbf9bf72c

Endereco de b: 0xbf9bf72b

Ou seja, a memória stack, basicamente, está da seguinte maneira:

b

a

Por outro lado, se o meu código é o seguinte:

int main (int argc, char *argv[])

{

int c, a;

char b;

printf("Endereco de argc: %p\n", &argc);

printf("Endereco de a: %p\n", &a);

printf("Endereco de b: %p\n", &B);

printf("Endereco de c: %p\n", &c);

return 0;

}

A saída é:

Endereco de argc: 0xbffa8bc0

Endereco de a: 0xbffa8bac

Endereco de b: 0xbffa8ba7

Endereco de c: 0xbffa8ba8

Ou seja, teríamos uma pilha da seguinte maneira:

b

c

a

argc

No entanto, seguindo o conceito de que as variáveis são empilhadas na memória em ordem de declaração, deveríamos ter, na verdade, o seguinte:

b

a

c

argc.

Alguém poderia me explicar o motivo dessa divergência?

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá vitorrtonon,

Olá, boa tarde!

Eu tenho uma dúvida a respeito da disposição da região de memória armazenada pelas variáveis de meu programa.

Nós sabemos que as variáveis são "empilhadas" na memória Stack a medida que aparecem no programa.

[...]

No entanto, seguindo o conceito de que as variáveis são empilhadas na memória em ordem de declaração, deveríamos ter, na verdade, o seguinte:

b

a

c

argc.

Alguém poderia me explicar o motivo dessa divergência?

Obrigado.

Uma característica by design do próprio compilador? Ele teria a liberdade para definir em que posições (na stack..) colocar as variáveis. Tentarei explicar; eu estendi o seu programa, dê uma olhada:

int main (int argc, char *argv[])
{
int c = 1, a = 2, d = 3;
char b;
int e;

printf("Endereco de argv: %p\n", &argv);
printf("Endereco de argc: %p\n\n", &argc);

printf("Endereco de c: %p - Valor: %d\n", &c, *(&c - 0));
printf("Endereco de a: %p - Valor: %d\n", &a, *(&c - 1));
printf("Endereco de d: %p - Valor: %d\n", &d, *(&c - 2));

printf("\nEndereco de b: %p\n", &;

printf("\nEndereco de e: %p\n", &e);

return 0;
}

E resulta:

stack frame (env, argv, argc)

Endereco de argv: 0028FF34

Endereco de argc: 0028FF30

stack frame (main() - auto variables)

Endereco de c: 0028FF1C - Valor: 1

Endereco de a: 0028FF18 - Valor: 2

Endereco de d: 0028FF14 - Valor: 3

Endereco de b: 0028FF13

Endereco de e: 0028FF0C

Passa a impressão que variáveis do mesmo tipo declaradas contiguamente são arranjadas em memória pelo compilador para poderem ser tratadas como scalars. No exemplo acima, o acesso aos valores das outras variáveis através de um offset tomando como base o endereço de c parece evidenciar essa possibilidade. Veja que a variável e, já não mais contígua, está alocada num endereço 8 bytes posterior ao da última inteira (d).

Creio que o acesso à documentação da especificação da linguagem ou do compilador poderia confirmar essa questão. Particularmente, não me restam muitas dúvidas sobre isso...

[]'s

LNW

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×