PROGRAMA E C [RESOLVIDO]

1. PROGRAMA E C [RESOLVIDO]

ale
aoshi001

(usa Kurumin)

Enviado em 03/09/2008 - 12:05h

Bom dia pessoa, to com uma duvida aqui num trabalho para a facul .

codigo abaixo.

#include <stdio.h>
int a, b;
int *p;
void f1(){
int c;
static int d;
printf("&c = %x, &d = %x\n",&c,&d);
}
int main(){
int e, f;
p = (int *)malloc(sizeof(int));
printf("&a = %x, &b = %x\n",&a,&b);
f1();
printf("&e = %x, &f = %x\n",&e,&f);
printf("&p = %x, *p = %x\n",&p,p);
printf("&main = %x, &f1 = %x\n",&main, &f1);
exit(0);
}
Apos compilar o programa cima, saiu a seguinte saida

&a = 404080, &b = 4040a0
&c = 22ff44, &d = 404010
&e = 22ff74, &f = 22ff70
&p = 404090, *p = 3d2448
&main = 401313, &f1 = 4012f0


Gostaria de saber por que as variaveis sao alocadas em seções diferentes na memória .



  


2. MELHOR RESPOSTA

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 03/09/2008 - 13:05h

vamos por partes...
antes de mais nada, é preciso distinguir entre as diferentes seções de dados. numa definição rápida e genérica, sem que nos aprofundemos em detalhes:

.data - área reservada a variáveis inicializadas, globais e estáticas (independente do escopo)

.bss - inicia logo após .data e possui dimensão variável. aqui ficam as variáveis não inicializadas

.rodata - apesar do termo esquisito, aqui ficam as "variáveis fixas" como por exemplo as construídas através do modificador const

heap - aqui as variáveis alocadas dinamicamente através da família malloc. é uma região crítica, visto que um erro aqui pode ser fatal ao processo e até mesmo ao so

agora vamos ao que interessa.
temos na saída:
&a = 404080, &b = 4040a0
&c = 22ff44, &d = 404010
&e = 22ff74, &f = 22ff70
&p = 404090, *p = 3d2448
&main = 401313, &f1 = 4012f0

se você analisar a saída, &a:&b:&d:&p estão na mesma seção. &c:&e:&f em outra, *p em outra e finalmente &main:&f1 em uma outra.

&a:&b:&d:&p pertencem à seção .data, embora não sejam inicializadas, como seria de se esperar a partir da definição. porém, a:b:p são variáveis globais e d é variável estática.

&c:&e:&f pertencem à seção .bss pelo simples fato de não estarem inicializadas e ao mesmo tempo possuírem escopo local.

*p pertencerá à heap por ter sido dinamicamente alocada. nesse caso em particular, é importante fixar que na heap estará o conteúdo (que na verdade é o que foi alocado) de p, mas que seu apontador está na seção .data (por ser global, senão estaria em .bss por não ser inicializado)

finalmente, &main:&f1 pertencem à seção .text, que é a seção de código e, a menos que explicitado através de diretivas do assembler ou de switches do linker, não poderá por padrão incluir dados (sejam estes manipuláveis ou não)

apenas como um dado a mais, o fato contraditório de uma variável global não inicializada precisar ir parar mandatoriamente em .data (onde se esperam variáveis inicializadas) é a razão pela qual alguns compiladores emitem avisos ao depararem com variáveis globais não inicializadas.





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts