[ Foro de C ]

Duda con memcpy()

31-Dec-2009 04:48
Sergio Gutierrez
1 Respuestas

Hola!! Esta es la primera vez que posteo, ya que no conocia la pagina. He estado hechando un vistazo por los temas de C pero no he encontrado nada sobre mi duda asique la planteo aqui.

Estoy trabajando con un "sistema de ficheros" y necesito la funcion memcpy para leer y escribir datos. Llego a un punto donde tengo esto:

void * buffer;
char bloque [1024];

// se llena por completo el bloque con caracteres.

memcpy(buffer, bloque[posicion], nbytes);

La cuestion es aniadir al buffer nbytes del array bloque cogidos a partir de posicion. Yo no le veo la complicacion, pero me da Fallo de segmentacion. He usado Valgrind para depurar y esto es lo que obtengo:

==13300== Invalid read of size 1
==13300==    at 0x4027BF0: memcpy (mc_replace_strmem.c:402)
==13300==    by 0x8049BAC: readFS (user.c:434)
==13300==    by 0x80489A4: main (catFS.c:66)
==13300==  Address 0x447 is not stack'd, malloc'd or (recently) free'd
==13300==
==13300== Process terminating with default action of signal 11 (SIGSEGV)
==13300==  Access not within mapped region at address 0x447
==13300==    at 0x4027BF0: memcpy (mc_replace_strmem.c:402)
==13300==    by 0x8049BAC: readFS (user.c:434)
==13300==    by 0x80489A4: main (catFS.c:66)
==13300==  If you believe this happened as a result of a stack overflow in your
==13300==  program's main thread (unlikely but possible), you can try to increase
==13300==  the size of the main thread stack using the --main-stacksize= flag.
==13300==  The main thread stack size used in this run was 8388608.
==13300==
==13300== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
==13300== malloc/free: in use at exit: 14,336 bytes in 4 blocks.
==13300== malloc/free: 4 allocs, 0 frees, 14,336 bytes allocated.
==13300== For counts of detected errors, rerun with: -v
==13300== searching for pointers to 4 not-freed blocks.
==13300== checked 65,560 bytes.
==13300==
==13300== LEAK SUMMARY:
==13300==    definitely lost: 0 bytes in 0 blocks.
==13300==      possibly lost: 0 bytes in 0 blocks.
==13300==    still reachable: 14,336 bytes in 4 blocks.
==13300==         suppressed: 0 bytes in 0 blocks.
==13300== Rerun with --leak-check=full to see details of leaked memory.
Fallo de segmentación


Pues como soy un poco novato en la depuracion ya que nunca antes lo habia usado, no se muy bien que quieren decir estas trazas. Quizas deba hacer un malloc a buffer? Pero es una variable que viene por paràmetro y ya esta reservado espacio en memoria.

Alguna idea?

Muchisimas Gracias!! Un Saludo!


06-Jan-2010 12:53
Nacho Cabanes (+83)

Decías:

> Quizas deba hacer un malloc a buffer? Pero es una variable que viene por paràmetro y ya esta reservado espacio en memoria.

El "malloc" tiene que estar hecho para reservar memoria. Pero si la variable se recibe como parámetro por referencia y el espacio ya está reservado, no necesitas volver a reservarlo.

Por tanto, volviendo a tu fuente:

void * buffer;
char bloque [1024];

// se llena por completo el bloque con caracteres.

memcpy(buffer, bloque[posicion], nbytes);

Los posibles problemas que veo son:

- Que buffer no esté reservado (damos por sentado que sí lo está), o esté reservado con un tamaño menor que "nbytes".

- Que a partir de bloque[posicion] halla reservados menos de "nbytes", por lo que mirarías más allá de la zona de memoria que te pertenece.

Pero en el fargmento que incluyes, no indicas los valores de "posicion" ni de "nbytes", con lo que no puedo darte detalles más concretos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)