¿Cuál es el uso del valor de retorno de memset ()?

90

memset()se declara para devolver void*que siempre es el mismo valor que la dirección pasada a la función.

¿Cuál es el uso del valor de retorno? ¿Por qué no vuelve void?

diente filoso
fuente
2
¿Cuál es el uso del valor de retorno de strcat()? A veces, las funciones estándar son lo que se especifica que son, no lo que deberían ser.
DevSolar
4
@MatthieuM .: Además, generalmente hay un costo distinto de cero asociado con la devolución de cosas. Incluso si el valor de retorno cabe en un registro, generalmente necesita cargar ese valor en el registro. Esto tiene un costo, por pequeño que sea.
NPE
15
@sharptooth: Una función de "matar a todos los humanos" devolvería el número de humanos muertos, por supuesto.
indiv
2
@MatthieuM .: No te preocupes por esas trivialidades, pero yo ciertamente podría. ¿Qué pasa si estoy escribiendo un compilador para un sistema de recursos limitados? ¿Hmmm?
Thomas Eding

Respuestas:

36

La firma está en línea con todas las otras funciones similares: memcpy(), strcpy()etc. Siempre pensé que esto se hizo para permitir a uno a las llamadas a la cadena de tales funciones, y que de otro modo utilizar este tipo de llamadas en las expresiones.

Dicho esto, nunca me he encontrado con una situación del mundo real en la que me sienta obligado a utilizar el valor de retorno de esa manera.

NPE
fuente
122

Puede usarse para el encadenamiento de llamadas como:

char a[200];
strcpy(memset(a, 0, 200), "bla");
Juraj Blaho
fuente
9
Sí, definitivamente es el caso de uso de 'encadenamiento'.
Cartesius00
6
He votado a favor de la respuesta porque es un caso interesante. Pero en la vida real, creo que es mejor mantener separadas las llamadas de memset y strcpy.
Tsvetomir Dimitrov
26
A los programadores de C les encanta el código ilegible, por lo que permitir el encadenamiento infinito es imprescindible al diseñar una función estándar.
Chad Schouggins
@ChadSchouggins Lea algo de código haskell y sabrá que los programadores en C son realmente bastante textuales;) (piensa en el "operador" de
expresiones regulares
Por supuesto, en este ejemplo habría tenido más sentido incluso, al revés, para strcpydevolver el puntero más allá del último copiado. memset(my_strcpy(a, "bla"), 0, a + 200);(como std::copy_ny std::fill_nhacer en C ++).
alfC
12

Para usar la función como argumento para otra función como sprintf

Noé
fuente
1

Me encontré con esta pregunta cuando busqué en Google para ver qué devolvía Memset.

Tengo un código en el que pruebo un valor, luego, si eso es cierto, pruebe para ver si un valor es ceros.

Debido a que no hay una forma completamente portátil en C para probar ceros, tengo que ejecutar Memset en el medio.

Entonces mi código es:

if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )

Esto habla del propósito de encadenamiento enumerado en las preguntas anteriores, pero es un ejemplo del uso de esta técnica.

Dejaré que otros juzguen si esta es una buena codificación o no.

Gerard Nicol
fuente