¡Muchas gracias por todo! Lo has explicado muy bien y de paso, ahora entiendo por qué existen los ** XD
Probaré DDD, a ver que tal se me da. Saludos. El 22 de abril de 2012 21:37, Miguel Angel <[email protected]>escribió: > Tienes que diferenciar entre la posición de memoria en la que se almacenan > las variables y la dirección a la que apuntan. De esta manera, la posición > de memoria en la que se encuentra "p" contiene, exactamente, la posición de > memoria de "*p". > > Y debería aplicarme el cuento, ya que me equivoqué :D > > Cuando usas "*p = *j" estás diciendo: allí donde apunta p, guarda lo que > apunta j". Pero como una imagen vale más que mil palabras, te mando la > imagen (punteros.png). > > Te invito a que tú también utilices DDD. Es un poco raro al principio, ya > que no se ha actualizado en casi 10 años, pero puedo asegurarte que no he > visto un depurador mejor (ni .Net, Java ni leches). > > Como ves, cuando hago el "*k = *j" tengo un segmentation fault, ya que > estoy haciendo una burrada :D > > El código es el siguiente: > > int main() > { > int value = 5; > > int* a; > int* b; > > int* j; > int* k; > > a = &value; > b = a; > > j = &value; > *k = *j; > > > return 0; > } > > > Sin embargo, con este código sí que sería válido: > > int main() > { > int value = 5; > > int* a; > int* b; > > int** j; > int** k; > > a = &value; > > j = &a; > k = &b; > *k = *j; > > return 0; > } > > > Como verás, puedo hacer "*k = *j" porque ambos son punteros a punteros > (punteros2.png). > > En fin... espero haberlo explicado bien (ahora sí) :D > > Un saludo! > > El 22 de abril de 2012 20:39, Dani <[email protected]> escribió: > > Gracias Miguel Ángel por haberte tomado el tiempo de explicármelo. >> >> Pero solo tengo una pregunta más, cuando dices: >> >> *Cuando igualas punteros, sólo estás haciendo que ambas variables >> apunten a la misma posición de memoria.* >> >> ¿Eso no ocurre si, por ejemplo, hago p=j;? Hasta ahora, creía que cuando >> se hacía la operación *p=*j, imaginando que son enteros, ¿no se crea una >> nueva posición de memoria? Es decir, que si modifico j, no cambiaría el >> valor de p; >> >> Saludos. >> >> El 22 de abril de 2012 19:10, Miguel Angel >> <[email protected]>escribió: >> >> Hola!! >>> >>> Para entenderlo bien, lo suyo es que comprendas cómo funciona un puntero. >>> >>> Básicamente, cuando tienes un puntero que apunta a una estructura, estás >>> guardando datos en dos sitios: por una parte, el puntero es una dirección >>> de memoria, que se guardará en el Heap; por otro, la estructura estará >>> almacenada en la posición de memoria, en el Stack. >>> >>> Cuando igualas punteros, sólo estás haciendo que ambas variables apunten >>> a la misma posición de memoria. En este caso tenemos tres zonas de memoria: >>> el puntero inicial y el segundo, que se encontrarán en el Heap, y la propia >>> estructura, que estará en el Stack. >>> >>> Cuando utilizas memcpy, lo que estás haciendo es realizar una copia de >>> la posición de memoria (el Stack) en otro sitio(también en el Stack). Ten >>> cuidado, porque memcpy no reservará esa memoria. >>> >>> Si comprendes la diferencia entre el Heap y el Stack, todo es más >>> sencillo. Cuando haces: >>> >>> - int i; >>> - void* pointer; >>> >>> etc, estás reservando memoria en el Heap. Ésta es volátil y la suele >>> gestionar el propio compilador. >>> >>> Cuando utilizas las funciones *alloc (Malloc, Alloc, Calloc, Strdup, >>> ...) estás usando el Stack, y eres tú el encargado de gestionar su >>> liberación. >>> >>> Por eso, cuando usas: "*p = *j", estás utilizando sólo el Heap. Cuando >>> usas "strcpy", estás leyendo y escribiendo en el Stack. >>> >>> Pintándolo: >>> http://video.google.com/videoplay?docid=-3462836456663764635&q=Pointer+C >>> Diferencias entre el Heap y el Stack: >>> http://wiki.answers.com/Q/What_is_difference_between_heap_memory_and_stack_memory >>> >>> Espero haberme explicado. Un saludo!! >>> >>> El 22 de abril de 2012 17:43, Dani <[email protected]> escribió: >>> >>>> ¡Buenas a todos! >>>> >>>> Pues simplemente quería preguntaros cual es la diferencia entre las >>>> siguientes sentencias, siendo variables definidas por una estructura g, en >>>> C: >>>> >>>> *p=*j; >>>> memcpy(p, j , sizeof(struct q)); >>>> >>>> Espero que alguien me pueda sacar de la duda. >>>> Gracias. >>>> >>>> _______________________________________________ >>>> CRySoL mailing list >>>> http://crysol.org/ >>>> https://arco.esi.uclm.es/cgi-bin/mailman/listinfo/crysol >>>> >>>> >>> >>> >>> -- >>> Miguel Ángel García Martínez >>> http://www.magmax.org >>> Mail <[email protected]> | Twitter<http://twitter.com/#magmax9> >>> | LinkedIn <http://www.linkedin.com/in/miguelangelgarciamartinez> | >>> about.me <http://about.me/miguelangelgarcia> >>> >>> >> > > > -- > Miguel Ángel García Martínez > http://www.magmax.org > Mail <[email protected]> | Twitter<http://twitter.com/#magmax9> > | LinkedIn <http://www.linkedin.com/in/miguelangelgarciamartinez> | > about.me <http://about.me/miguelangelgarcia> > >
_______________________________________________ CRySoL mailing list http://crysol.org/ https://arco.esi.uclm.es/cgi-bin/mailman/listinfo/crysol
