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.