Matrices sin tamaño en estructuras

Específicos de Microsoft

Una extensión de Microsoft permite que el último miembro de C/C++. o estructura o clase de C++ es una matriz variable-clasificado.Éstas se denominan matrices sin tamaño.La matriz sin tamaño al final de la estructura le permite anexe la cadena variable-clasificada u otro matriz, para evitar el costo de ejecución en tiempo de ejecución de un puntero desreferencie.

// unsized_arrays_in_structures1.cpp
// compile with: /c
struct PERSON {
   unsigned number;
   char name[];   // Unsized array
};

Si se aplica el operador de sizeof a esta estructura, el tamaño de la matriz de cierre se considera 0.El tamaño de esta estructura es 2 bytes, que es el tamaño del miembro sin signo.Para obtener el tamaño real de una variable de PERSONescrito, es necesario obtener el tamaño de la matriz por separado.

El tamaño de la estructura se agrega al tamaño de la matriz para obtener el tamaño total que se asignará.Después de la asignación, se copia el miembro de matriz de la estructura, como se muestra a continuación:

Ejemplo

// unsized_arrays_in_structures2.cpp
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

enum {
   sizeOfBuffer = 40
};

struct PERSON {
   unsigned number;
   char name[];   // Unsized array
};

int main() {
   char szWho[sizeOfBuffer];
   PERSON *ptrPerson = NULL;

   printf_s( "Enter name: " );
   gets_s( szWho, sizeOfBuffer );
 
   // Allocate space for structure, name, and terminating null
   ptrPerson = (PERSON *)malloc( sizeof( struct PERSON ) 
                           + strlen( szWho ) + 1 );

   // Copy the string to the name member
   strcpy_s( ptrPerson->name, sizeOfBuffer, szWho );
}
  John

Comentarios

Incluso se inicializa la matriz de la variable de estructura, el operador de sizeof devuelve el tamaño de la variable sin la matriz.

Las estructuras con matrices sin tamaño pueden inicializar, pero las matrices de estas estructuras no se pueden inicializar.

struct PERSON me  = { 6, "Me" };        // Legal
struct PERSON you = { 7, "You" };

struct PERSON us[2] = { { 8, "Them" },  // Error
                        { 9, "We" } };

Una matriz de caracteres inicializada con un literal de cadena obtiene el espacio para null que finalizaba; matriz inicializada con los caracteres individuales (por ejemplo, {“a”, “b”, “c”}) no.

Una estructura con una matriz sin tamaño puede aparecer en otras estructuras, siempre es el último miembro declarado en su estructura envolvente.Las clases o estructuras con matrices sin tamaño no pueden tener bases virtuales directas o indirectas.

Para obtener información relacionada, vea volatile y #define.

Vea también

Referencia

struct (C++)