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.