Endereços de ponteiros dentro de ponteiros para estruturas.

1. Endereços de ponteiros dentro de ponteiros para estruturas.

Estevão Dominique Ribeiro Dias
estevaodrdias

(usa openSUSE)

Enviado em 24/07/2012 - 11:24h

Bom dia, pessoal. Alguém saberia me explicar porquê os endereços das variáveis i e d->value são diferentes já que no código abaixo d->value aponta para i?


#include <stdio.h>
#include <stdlib.h>

typedef struct data_tag
{
int *value;
} *data;

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

data d;
int i;

i = 10;

d = malloc(sizeof(struct data_tag));
d->value = &i;

printf("%p\n", &i);
printf("%d\n", i);

printf("%p\n", &d->value);
printf("%d\n", *d->value);

*d->value *= 2;

printf("%p\n", &i);
printf("%d\n", i);

printf("%p\n", &d->value);
printf("%d\n", *d->value);

printf("%p\n", &d);

system("PAUSE");
return 0;
}


  


2. Re: Endereços de ponteiros dentro de ponteiros para estruturas.

jarlisson moreira
jarlisson

(usa Fedora)

Enviado em 24/07/2012 - 12:15h

Cuidado pra nao confundir endereço com conteúdo armazenado.

i e d são duas variáveis declaradas, são diferentes.
Portanto, tem endereços diferentes na memória. A diferença é que a que for ponteiro armazena o endereço de outra (assim como a outra armazena um inteiro, o ponteiro armazena um número de endereço), mas não que dizer que o endereço desse ponteiro seja o endereço da outra.


3. Re: Endereços de ponteiros dentro de ponteiros para estruturas.

Estevão Dominique Ribeiro Dias
estevaodrdias

(usa openSUSE)

Enviado em 24/07/2012 - 15:17h

jarlisson escreveu:

Cuidado pra nao confundir endereço com conteúdo armazenado.

i e d são duas variáveis declaradas, são diferentes.
Portanto, tem endereços diferentes na memória. A diferença é que a que for ponteiro armazena o endereço de outra (assim como a outra armazena um inteiro, o ponteiro armazena um número de endereço), mas não que dizer que o endereço desse ponteiro seja o endereço da outra.


Entendi. Já corrigi o código ficando assim:

#include <stdio.h>
#include <stdlib.h>

typedef struct data_tag
{
int *value;
} *data;

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

data d;
int i;

i = 10;

d = malloc(sizeof(struct data_tag));
d->value = &i;

printf("%p\n", &i);
printf("%d\n", i);

printf("%p\n", d->value);
printf("%d\n", *d->value);

*d->value *= 2;

printf("%p\n", &i);
printf("%d\n", i);

printf("%p\n", d->value);
printf("%d\n", *d->value);

printf("%p\n", &d);

system("PAUSE");
return 0;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts