Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Shon en 24 Enero 2011, 22:31 pm



Título: (void *) en funciones
Publicado por: Shon en 24 Enero 2011, 22:31 pm
Una pregunta muy básica pero que no me termino de aclarar:

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

Código
  1. memset((char *)&estructura, '\0', sizeof(estructura));  // Por poner un ejemplo
  2.  

La función memset tiene este prototipo:

Código
  1. #include <string.h>
  2.  
  3. void *memset(void *s, int c, size_t n);
  4.  
  5.  

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:

Código
  1. memset((void *)&estructura, '\0', sizeof(estructura));  // Por poner un ejemplo
  2.  

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

Gracias ;)


Título: Re: (void *) en funciones
Publicado por: negux en 25 Enero 2011, 00:54 am
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 (http://c.conclase.net/librerias/?ansifun=memset)

alomejor por eso hacen eso


Título: Re: (void *) en funciones
Publicado por: do-while en 25 Enero 2011, 02:39 am
¡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!


Título: Re: (void *) en funciones
Publicado por: Shon en 25 Enero 2011, 14:09 pm
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


Título: Re: (void *) en funciones
Publicado por: Littlehorse en 25 Enero 2011, 16:06 pm
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