2010-11-20 20 views
10

Lo que se arrastran de la matriz Idiom?se arrastra Idiom matriz

P.S: Google utilizar este término da Los vectores se implementan utilizando la expresión de la matriz final, por lo que no se pueden redimensionar sin cambiar la dirección del objeto vectorial en sí.

+0

Como otros han comentado algunas de las respuestas a continuación, tendrías más suerte buscando _flexible array member_. – ninjalj

+0

Tenga en cuenta que, por definición estricta, esto invoca _UB_: http://stackoverflow.com/questions/3711233/is-the-struct-hack-technically-undefined-behavior – sbi

Respuesta

10

Si se refiere a la expresión idiomática gama de arrastre mencionados en el GCC source code (donde su cotización viene), parece referirse al viejo truco C para implementar una matriz dinámica:

typedef struct { 
    /* header */ 
    size_t nelems; 

    /* actual array */ 
    int a[1]; 
} IntVector; 

donde sería una matriz creada con

IntVector *make_intvector(size_t n) 
{ 
    IntVector *v = malloc(sizeof(IntVector) + sizeof(int) * (n-1)); 
    if (v != NULL) 
     v->nelems = n; 
    return v; 
} 
+3

Si se refiere a eso, el término más común es el [struct hack] (http://stackoverflow.com/q/3711233/168225). –

+0

@Georg: No creo (aunque no estoy seguro) se está refiriendo a que de lo contrario el término (como usted ha mencionado) 'struct hack' se habría utilizado en lugar de' Trailing array idiom'. –

+0

@Prasoon: el autor podría haber usado un término diferente, no sería la primera vez que alguien hiciera eso. "Struct Hack" suena un poco informal de todos modos. –

1

Parece referirse a las matrices en estructuras, que puede tener un matriz de tamaño variable. Ver:

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx y http://sourceware.org/gdb/current/onlinedocs/gdbint/Support-Libraries.html

Otro consejo, si google para una expresión poner la expresión en "" como "detrás de matriz" esto le dará resultados más específicos. Google sabe acerca de las matrices finales.

+0

1 para el enlace al artículo de MSDN, cosas interesantes . –

1

Creo que lo que se quiere decir es:

struct foo { 
    ... some data members, maybe the length of bar ... 
    char bar[]; /* last member of foo, char is just an example */ 
}; 

Se utiliza asignando con malloc(sizeof(struct foo)+LEN), donde LEN es la longitud deseada de bar. De esta forma, solo se necesita malloc. El [] solo se puede usar con el último miembro de la estructura.

Y, tan pronto como entiendo el documento de GCC, struct foo también puede usarse (razonablemente) como último miembro de otra estructura, porque el tamaño de almacenamiento no es fijo, o como puntero.

+0

Esto se denomina "miembro de matriz flexible" y está en el estándar C99 (§6.7.2.1P16). – aib

Cuestiones relacionadas