Buenas, Cuando comentas lo del heap/stack, me surge la duda de si no es al revés (al menos así lo tenía yo interiorizado). Es decir, el stack es donde se almacenan las variables de una función y al retornar de la función se eliminan del stack y con operaciones malloc reservas memoria en el heap; que no es ni más ni menos que memoria paginada reservada por el SO para el proceso. Corresponde al proceso la liberación de las páginas reservadas en el heap.
Saludos! De: [email protected] [mailto:[email protected]] En nombre de Dani Enviado el: domingo, 22 de abril de 2012 23:31 Para: Miguel Angel CC: Lista CRySoL Asunto: Re: [CRySoL] Diferencia entre *p=*p y memcpy ¡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]<mailto:[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]<mailto:[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]<mailto:[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]<mailto:[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<mailto:[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<mailto:[email protected]> | Twitter<http://twitter.com/#magmax9> | LinkedIn<http://www.linkedin.com/in/miguelangelgarciamartinez> | about.me<http://about.me/miguelangelgarcia> ________________________________ Este mensaje se dirige exclusivamente a su destinatario. Puede consultar nuestra política de envío y recepción de correo electrónico en el enlace situado más abajo. This message is intended exclusively for its addressee. We only send and receive email on the basis of the terms set out at http://www.tid.es/ES/PAGINAS/disclaimer.aspx
_______________________________________________ CRySoL mailing list http://crysol.org/ https://arco.esi.uclm.es/cgi-bin/mailman/listinfo/crysol
