Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 erroComplementando a explicação do Beraldo.
Em um contexto menos técnico pode-se dizer que cada ponteiro possui 3 valores:
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.
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
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:
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