utiliza que para c++ c function

c++ - que - Definición y uso de Memset



memset char c (6)

Entiendo ligeramente cuál es la definición de memset() . Sin embargo, no entiendo para qué sirve.

Definición: Establece los primeros bytes numéricos del bloque de memoria apuntado por ptr al valor especificado (interpretado como un carácter sin signo).

Entonces, ¿esto codifica un valor en una dirección de memoria?

memset(&serv_addr,0,sizeof(serv_addr) es el ejemplo que trato de entender.

¿Alguien puede explicar de una manera MUY simplificada?


No es más que establecer la memoria a un valor particular.

Aquí hay un código de ejemplo.

Memset (const * p, unit8_t V, unit8_t L), Aquí el P es el puntero a la memoria de destino, V es el valor para el buffer de destino que se establecerá en un valor V y l es la longitud de los datos.

while(L --> 0) { *p++ = V; }


Supongo que serv_addr es una variable local o global de algún tipo de struct sockaddr -quizás struct sockaddr (o tal vez una class ).

&serv_addr toma la dirección de esa variable. Es una dirección válida, dada como primer argumento para memset . El segundo argumento para memset es el byte que se utilizará para llenar (cero byte). El último argumento para memset es el tamaño, en bytes, de esa zona de memoria a llenar, que es el tamaño de esa variable serv_addr en su ejemplo.

Entonces, esta llamada a memset borra una variable global o local serv_addr contiene alguna struct .

En la práctica, el compilador de GCC , cuando está optimizando, generará un código inteligente para eso, usualmente desenrollándolo e insertándolo (en realidad, a menudo es un built-in, por lo que GCC puede generar código muy inteligente para él).


memset-set bytes en la memoria

Sinopsis-

#include<string.h>

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

Descripción- La función memset () copiará c (convertida en una char sin signo) en cada uno de los primeros n bytes del objeto apuntado por s. Aquí para la función anterior, el memset () devolverá el valor de s.


memset() es una versión muy rápida de una operación relativamente simple:

void* memset(void* b, int c, size_t len) { char* p = (char*)b; for (size_t i = 0; i != len; ++i) { p[i] = c; } return b; }

Es decir, memset(b, c, l) establece los l bytes que comienzan en la dirección b en el valor c . Simplemente lo hace mucho más rápido que en la implementación anterior.


memset() se usa generalmente para inicializar valores. Por ejemplo, considere la siguiente estructura:

struct Size { int width; int height; }

Si creas uno de estos en la pila, así:

struct Size someSize;

Entonces los valores en esa estructura van a estar indefinidos. Podrían ser cero, podrían ser los valores que estuvieran allí desde cuando esa porción de la pila fue utilizada por última vez. Por lo general, seguirías esa línea con:

memset(&someSize, 0, sizeof(someSize));

Por supuesto, se puede usar para otros escenarios, este es solo uno de ellos. Solo piense en ello como una forma de simplemente establecer una parte de la memoria en un cierto valor.


memset es una forma común de establecer una región de memoria en 0 independientemente del tipo de datos. Se puede decir que a memset no le importa el tipo de datos y simplemente establece todos los bytes a cero.

En mi humilde opinión, en C ++ uno debe evitar hacer memset cuando sea posible, ya que elude la seguridad de tipo que proporciona C ++, en su lugar, uno debe usar el constructor o la inicialización como medio de inicialización. memset hecho en una instancia de clase también puede destruir algo involuntariamente:

p.ej

class A { public: shared_ptr<char*> _p; };

un memset en una instancia de lo anterior no haría un contra-decremento de referencia correctamente.