(void *) en funciones

Iniciado por Shon, 24 Enero 2011, 22:31 PM

0 Miembros y 1 Visitante están viendo este tema.

Shon

Una pregunta muy básica pero que no me termino de aclarar:

veo en muchos códigos que hacen cosas como esta:


memset((char *)&estructura, '\0', sizeof(estructura));  // Por poner un ejemplo


La función memset tiene este prototipo:


#include <string.h>

void *memset(void *s, int c, size_t n);



Yo entiendo que se ponga void * s, porque así la hacemos más generica que poniendo por ejemplo char. Pero cuando la invocamos, no deberiamos de hacer esto:


memset((void *)&estructura, '\0', sizeof(estructura));  // Por poner un ejemplo


En lugar de loq ue hay escrito más arriba.

Gracias ;)

negux

Encontre esto:

Copia el valor de c (convertido a unsigned char) en cada uno de los primeros n caracteres en el objeto apuntado por s.
http://c.conclase.net/librerias/?ansifun=memset

alomejor por eso hacen eso

do-while

¡Buenas!

Si quieres puedes hacer el cast a void*, pero recuerda que en C se le puede asignar sin ningun problema cualquier tipo de puntero o direccion de memoria a un puntero a void. En cambio, para hacerlo a la inversa (pasar de void* a otro tipo) si que tienes que indicar explicitamente la conversion.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Shon

Gracias chicos!!

daniel, pero mirando el prototipo pone (void *), por lo que no me parece lógico, ya que esa conversión a char se debería de hacer dentro de la función y no ser tarea del usuario de dicha función, eso creo yo (si me estoy colando, plis un tirón de orejas jajaj).

un saludo

Littlehorse

No es tarea del usuario de dicha función porque en el caso que planteas el cast ni siquiera es necesario.
Se utiliza el puntero void no solo para que la función sea genérica en cuanto a los parámetros que recibe si no que también es genérica en su funcionamiento; memset desconoce los tipos de datos utilizados ni los necesita.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.