Duvida sobre alocação de memória
ex. vamos supor que exista uma struct _Data
{
char m_cDia;
char m_cMes;
short m_shAno;
short m_shAnoMin, m_shAnoMax;
};
typedef struct _Data Data;
void Inicia( Data * pdtParam );
/* ************************** */
void Inicia( Data * pdtParam )
{
pdtParam->m_shAnoMIn = 1;
pdtParam->m_shAnoMax = 9999;
}
/* ************************** */
// então qd acontece a chamada:
int main()
{
Data dtHoje;
Inicia(&dtHoje);
return 0;
}
duvida 1: Como foi a alocação de memória neste caso ?
duvida 2: e se a função inicia fosse: Data Inicia(Data dtParam) e fosse usada assim:
Inicia(dtHoje) como seria a alocação de memória neste outro caso ?
{
char m_cDia;
char m_cMes;
short m_shAno;
short m_shAnoMin, m_shAnoMax;
};
typedef struct _Data Data;
void Inicia( Data * pdtParam );
/* ************************** */
void Inicia( Data * pdtParam )
{
pdtParam->m_shAnoMIn = 1;
pdtParam->m_shAnoMax = 9999;
}
/* ************************** */
// então qd acontece a chamada:
int main()
{
Data dtHoje;
Inicia(&dtHoje);
return 0;
}
duvida 1: Como foi a alocação de memória neste caso ?
duvida 2: e se a função inicia fosse: Data Inicia(Data dtParam) e fosse usada assim:
Inicia(dtHoje) como seria a alocação de memória neste outro caso ?
Fabiano Góes
Curtidas 0
Respostas
Massuda
22/03/2006
[quote:5a8f0cf03b=´Fabiano Góes´]Como foi a alocação de memória neste caso ?[/quote:5a8f0cf03b]dtHoje é alocada na pilha do programa; o espaço necessário para essa variável é alocado na pilha pelo código (inserido pelo compilador) que é executado ao iniciar a função main().
[quote:5a8f0cf03b=´Fabiano Góes´]e se a função inicia fosse: Data Inicia(Data dtParam) e fosse usada assim:[/quote:5a8f0cf03b]Também é alocada na pilha do programa, mas essa alocação é feita quando da chamada da função Inicia(); como o parâmetro é passado por valor nesse caso, na chamada da função Inicia() o compilador além de reservar memória na pilha faz uma cópia de dtHoje nessa struct Data recém alocada; alterações feitas em dtParam não se refletem em dtHoje. Isso é uma fonte ´legal´ de bugs difíceis de se achar.
[quote:5a8f0cf03b=´Fabiano Góes´]e se a função inicia fosse: Data Inicia(Data dtParam) e fosse usada assim:[/quote:5a8f0cf03b]Também é alocada na pilha do programa, mas essa alocação é feita quando da chamada da função Inicia(); como o parâmetro é passado por valor nesse caso, na chamada da função Inicia() o compilador além de reservar memória na pilha faz uma cópia de dtHoje nessa struct Data recém alocada; alterações feitas em dtParam não se refletem em dtHoje. Isso é uma fonte ´legal´ de bugs difíceis de se achar.
GOSTEI 0
Fabiano Góes
22/03/2006
massuda:
vc conhece algum livro ou algum material sobre:
alocação de memoria, pilha, etc ?
vc conhece algum livro ou algum material sobre:
alocação de memoria, pilha, etc ?
GOSTEI 0
Massuda
22/03/2006
[quote:53895e9c6c=´Fabiano Góes´]vc conhece algum livro...[/quote:53895e9c6c]Não.
GOSTEI 0