Luthien 0 Denunciar post Postado Fevereiro 8, 2015 Estou aproveitando as ferias pra dar uma revisada na materia e tive essa dúvida int *ptr1, *ptr2, numero; ptr1 = (int*) malloc(sizeof(int)); ptr1 = 7; printf("Endereco PTR1: %d", &ptr1); ptr2 = ptr1; printf("Endereco PTR2: %d", &ptr2); // free(ptr1); // numero = *ptr2;É uma duvida sobre ponteiro solto. Sei que ponteiro solto é um ponteiro que tem endereço de uma célula de memória que já foi liberada. Minha dúvida surgiu quando fui testar imprimindo os endereços de ptr1 e ptr2, pq imprimiu endereços diferentes. Ao fazer ptr2 = ptr1 eu estou passando só o conteúdo de ptr1? Pq na explicação da apostila fala q é endereço... se for apenas o conteúdo não vai ser um ponteiro solto pq ptr2 tem seu próprio endereço e o free() que foi dado em ptr1 não vai interferir, certo? Fiquei confusa com esse códigoSó comentei as linhas ali pra poder testar sem dar erro Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 9, 2015 ptr1 e ptr2 são duas variáveis diferentes. Logo, mesmo que apontem para o mesmo endereço de memória, elas ocuparão endereços diferentes na memória. Você está usando &ptr1 e &ptr2, que representam os endereços dos ponteiros na memória. Se você quiser exibir o endereço para o qual eles apontam, deve usar ptr1 e ptr2. E para exibir seus valores, use *ptr1 e *ptr2/ Outro erro no seu código foi atribuir o número 7 ao endereço para o qual ptr1 aponta. Creio que você queria atribuir o valor 7 a ele. Ou seja, deveria usar "*ptr1 = 7;". Teste este código para entender melhor: int *ptr1, *ptr2; ptr1 = (int*) malloc(sizeof(int)); *ptr1 = 7; printf("Endereco PTR1: %p\n", ptr1); ptr2 = ptr1; printf("Endereco PTR2: %p\n", ptr2); printf("Valor de ptr1: %d\n", *ptr1 ); printf("Valor de ptr2: %d\n", *ptr2 ); Veja que ptr1 e ptr2, de fato, apontam para o mesmo endereço. E também possuem o mesmo valor. Porém, &ptr1 e &ptr2 terão valores distintos, pois estamos falando de dois ponteiros, que ocupam endereços distintos na memória Compartilhar este post Link para o post Compartilhar em outros sites
cahe7cb 27 Denunciar post Postado Fevereiro 9, 2015 Complementando a explicação do Beraldo. Em um contexto menos técnico pode-se dizer que cada ponteiro possui 3 valores: - Endereço onde ele está - Endereço para qual ele aponta - Valor para qual ele aponta Considerando o seguinte código: int *p1, *p2; p1 = (int*)malloc(sizeof(int)); p2 = p1; // onde eles estão? printf("p1 esta em: %p\n", (void*)&p1); // diferente printf("p2 esta em: %p\n", (void*)&p2); // diferente // para onde eles apontam? printf("p1 aponta para: %p\n",(void*)p1); // igual printf("p2 aponta para: %p\n",(void*)p2); // igual // alterando o valor *p1 = 2015; // valor para qual eles apontam? printf("p1 tem valor: %d\n",*p1); // igual, 2015 printf("p2 tem valor: %d\n",*p2); // igual, 2015 Quando eu alterei o valor de p1, como ambos apontam para o mesmo valor, p2 também foi alterado. Se eu liberar a memória para qual p1 aponta, a memória de p2 também será liberada gerando um ponteiro solto. Compartilhar este post Link para o post Compartilhar em outros sites
Luthien 0 Denunciar post Postado Fevereiro 9, 2015 Nossa, muito obrigada me ajudou mt. Quanto ao código, era o que o prof usou para explicar ponteiros soltos, só acrescentei os printfs pra testar mesmo. Ficou tão mais fácil de entender, valeu mesmo! :D Compartilhar este post Link para o post Compartilhar em outros sites