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

Responder a