structs example array c struct initialization

example - struct initialization c++



Inicializando una estructura a 0 (3)

El primero es el más fácil ( implica menos tipeo ), y está garantizado que funciona, todos los miembros se establecerán en 0 [Ref 1] .
El segundo es más legible.

La elección depende de la preferencia del usuario o la que el estándar de codificación exige.

[Ref 1] Referencia C99 Norma 6.7.8.21:

Si hay menos inicializadores en una lista adjunta que no hay elementos o miembros de un agregado, o menos caracteres en un literal de cadena utilizado para inicializar una matriz de tamaño conocido que no hay elementos en la matriz, el resto del agregado inicializarse implícitamente lo mismo que los objetos que tienen una duración de almacenamiento estática.

Buena lectura:
C y C ++: inicialización parcial de la estructura automática

Si tengo una estructura como esta:

typedef struct { unsigned char c1; unsigned char c2; } myStruct;

¿Cuál sería la forma más fácil de inicializar esta estructura en 0? Sería suficiente lo siguiente?

myStruct _m1 = {0};

o ¿Tendría que iniciar explícitamente cada miembro a 0?

myStruct _m2 = {0,0};


Si los datos son una variable estática o global, están llenos a cero por defecto, así que simplemente declare myStruct _m;

Si los datos son una variable local o una zona asignada en el montón, memset con memset como:

memset(&m, 0, sizeof(myStruct));

Los compiladores actuales (por ejemplo, versiones recientes de gcc ) optimizan bastante bien en la práctica. Esto funciona solo si todos los valores cero (incluyen punteros nulos y coma flotante cero) se representan como todos los bits cero, lo cual es cierto en todas las plataformas que conozco (pero el estándar C permite implementaciones donde esto es falso; no conozco tal implementación) .

Quizás myStruct m = {}; codificar myStruct m = {}; (que podría ser aceptado como una extensión) pero me parece bastante feo. Y si el primer miembro de la estructura no es escalar, es decir, es una unión, una estructura o una matriz, luego se codifica myStruct m = {0}; Es incorrecto.

Mi sensación es que usar memset para estructuras locales es lo mejor, y transmite mejor el hecho de que en tiempo de ejecución, algo tiene que hacerse (mientras que generalmente, los datos globales y estáticos se pueden entender como inicializados en tiempo de compilación, sin costo en tiempo de ejecución )


Ver §6.7.9 Inicialización:

21 Si hay menos inicializadores en una lista encerrada que elementos o miembros de un agregado, o menos caracteres en un literal de cadena usado para inicializar una matriz de tamaño conocido que no hay elementos en la matriz, el resto del agregado se inicializarán implícitamente de la misma manera que los objetos que tienen una duración de almacenamiento estática.

Entonces, sí, ambos funcionan. Tenga en cuenta que en C99 también se puede usar una nueva forma de inicialización, denominada inicialización designada:

myStruct _m1 = {.c2 = 0, .c1 = 1};