Re: Diferencia entre *p=*p y memcpy
Miguel Angel <miguelangel.garcia <at> gmail.com>
2012-04-22 19:37:23 GMT
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!
--
Miguel Ángel García Martínez


<div>
<p>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".</p>
<div>
<br>
</div>
<div>Y debería aplicarme el cuento, ya que me equivoqué :D</div>
<div><br></div>
<div>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).</div>
<div><br></div>
<div>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).</div>
<div><br></div>
<div>Como ves, cuando hago el "*k = *j" tengo un segmentation fault, ya que estoy haciendo una burrada :D</div>
<div><br></div>
<div>El código es el siguiente:</div>
<div><blockquote>
<div>
<div>int main()</div>
<div>{</div>
<div> int value = 5;</div>
<div><br></div>
<div> int* a;</div>
<div> int* b;</div>
<div><br></div>
<div> int* j;</div>
<div> int* k;</div>
<div><br></div>
<div> a = &value;</div>
<div>
b = a;</div>
<div><br></div>
<div> j = &value;</div>
<div> *k = *j;</div>
<div><br></div>
<div><br></div>
<div> return 0;</div>
<div>}</div>
</div>
</blockquote></div>
<div><br></div>
<div>Sin embargo, con este código sí que sería válido:</div>
<div><blockquote><div>
<div>int main()</div>
<div>{</div>
<div> int value = 5;</div>
<div><br></div>
<div> int* a;</div>
<div> int* b;</div>
<div><br></div>
<div> int** j;</div>
<div> int** k;</div>
<div><br></div>
<div> a = &value;</div>
<div><br></div>
<div> j = &a;</div>
<div> k = &b;</div>
<div> *k = *j;</div>
<div><br></div>
<div> return 0;</div>
<div>}</div>
</div></blockquote></div>
<div>
<br><div>Como verás, puedo hacer "*k = *j" porque ambos son punteros a punteros (punteros2.png).</div>
<div><br></div>
<div>En fin... espero haberlo explicado bien (ahora sí) :D</div>
<div><br></div>
<div>Un saludo!</div>
<div>
<br><div class="gmail_quote">El 22 de abril de 2012 20:39, Dani <span dir="ltr"><<a href="mailto:dani <at> azthe.com">dani <at> azthe.com</a>></span> escribió:<br><blockquote class="gmail_quote">
<div class="gmail_extra"><span>Gracias Miguel Ángel por haberte tomado el tiempo de explicármelo. </span></div>
<div class="gmail_extra"><span><br></span></div>
<div class="gmail_extra"><span>Pero solo tengo una pregunta más, cuando dices:</span></div>
<div class="gmail_extra"><span><br></span></div>
<div class="gmail_extra">
<div class="im">
<span>Cuando igualas punteros, sólo estás haciendo que ambas variables apunten a la misma posición de memoria.</span><br><br>
</div>¿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;</div>
<div class="gmail_extra"><br></div>
<div class="gmail_extra">Saludos.</div>
<div class="gmail_extra">
<br><div class="gmail_quote">El 22 de abril de 2012 19:10, Miguel Angel <span dir="ltr"><<a href="mailto:miguelangel.garcia <at> gmail.com" target="_blank">miguelangel.garcia <at> gmail.com</a>></span> escribió:<div>
<div class="h5">
<br><blockquote class="gmail_quote">Hola!!<div><br></div>
<div>Para entenderlo bien, lo suyo es que comprendas cómo funciona un puntero.</div>
<div><br></div>
<div>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.</div>
<div><br></div>
<div>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.</div>
<div><br></div>
<div>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.</div>
<div>
<br>
</div>
<div>Si comprendes la diferencia entre el Heap y el Stack, todo es más sencillo. Cuando haces:</div>
<div>
<ul>
<li>int i;</li>
<li>void* pointer;</li>
</ul>
<div>etc, estás reservando memoria en el Heap. Ésta es volátil y la suele gestionar el propio compilador.</div>
</div>
<div><br></div>
<div>Cuando utilizas las funciones *alloc (Malloc, Alloc, Calloc, Strdup, ...) estás usando el Stack, y eres tú el encargado de gestionar su liberación.</div>
<div><br></div>
<div>Por eso, cuando usas: "*p = *j", estás utilizando sólo el Heap. Cuando usas "strcpy", estás leyendo y escribiendo en el Stack.</div>
<div>
<br>Pintándolo: <a href="http://video.google.com/videoplay?docid=-3462836456663764635&q=Pointer+C" target="_blank">http://video.google.com/videoplay?docid=-3462836456663764635&q=Pointer+C</a>
</div>
<div>Diferencias entre el Heap y el Stack: <a href="http://wiki.answers.com/Q/What_is_difference_between_heap_memory_and_stack_memory" target="_blank">http://wiki.answers.com/Q/What_is_difference_between_heap_memory_and_stack_memory</a>
</div>
<div><br></div>
<div>Espero haberme explicado. Un saludo!!<br><br><div class="gmail_quote">El 22 de abril de 2012 17:43, Dani <span dir="ltr"><<a href="mailto:dani <at> azthe.com" target="_blank">dani <at> azthe.com</a>></span> escribió:<br><blockquote class="gmail_quote">
<div><div>
¡Buenas a todos!<div><br></div>
<div>Pues simplemente quería preguntaros cual es la diferencia entre las siguientes sentencias, siendo variables definidas por una estructura g, en C:</div>
<div><br></div>
<div>*p=*j;</div>
<div>memcpy(<span>p, </span><span>j , sizeof(struct q));</span>
</div>
<div><br></div>
<div>Espero que alguien me pueda sacar de la duda.</div>
<div>Gracias.</div>
<br>
</div></div>_______________________________________________<br>
CRySoL mailing list<br><a href="http://crysol.org/" target="_blank">http://crysol.org/</a><br><a href="https://arco.esi.uclm.es/cgi-bin/mailman/listinfo/crysol" target="_blank">https://arco.esi.uclm.es/cgi-bin/mailman/listinfo/crysol</a><br><br>
</blockquote>
</div>
<span><br><br clear="all"><div><br></div>-- <br>Miguel Ángel García Martínez<div>
<a href="http://www.magmax.org" target="_blank">http://www.magmax.org</a><br><div>
<a href="mailto:miguelangel.garcia <at> gmail.com" target="_blank">Mail</a> | <a href="http://twitter.com/#magmax9" target="_blank">Twitter</a> | <a href="http://www.linkedin.com/in/miguelangelgarciamartinez" target="_blank">LinkedIn</a> | <a href="http://about.me/miguelangelgarcia" target="_blank">about.me</a> <br>
</div>
</div>
<br></span>
</div>
</blockquote>
</div>
</div>
</div>
<br>
</div>
</blockquote>
</div>
<br><br clear="all"><div><br></div>-- <br>Miguel Ángel García Martínez<div>
<a href="http://www.magmax.org" target="_blank">http://www.magmax.org</a><br><div>
<a href="mailto:miguelangel.garcia <at> gmail.com" target="_blank">Mail</a> | <a href="http://twitter.com/#magmax9" target="_blank">Twitter</a> | <a href="http://www.linkedin.com/in/miguelangelgarciamartinez" target="_blank">LinkedIn</a> | <a href="http://about.me/miguelangelgarcia" target="_blank">about.me</a> <br>
</div>
</div>
<br>
</div>
</div>
</div>