2008-10-11 16 views
15

¿Es posible inicializar una matriz de punteros a estructuras? Algo así como:¿Cómo puedo inicializar una matriz de punteros a estructuras?

struct country_t *countries[] = { 
     {"United States of America", "America"}, 
     {"England", "Europe"}, 
     {"Ethiopia", "Africa"} 
    } 

quiero hacer eso con el fin de obtener las entidades de la memoria no-contigua, y los punteros a ellos en memoria contigua ... Pero no puedo usar la memoria dinámica, por lo que Me pregunto si es posible sin eso.

Respuesta

30

Bueno, su código usa estructuras en lugar de indicadores para las estructuras. Hay maneras de hacer lo que buscas, incluyendo:

static struct country_t us = { "United States of America", "America" }; 
static struct country_t uk = { "England",     "Europe" }; 
static struct country_t et = { "Ethiopia",     "Africa" }; 

struct country_t *countries[] = { &us, &uk, &et, }; 

Hay otras maneras de hacerlo con inicializadores designados y literales compuestos en C99. Sección 6.5.2.5 'literales compuestos' muestra el camino:

struct country_t *countries[] = 
{ 
    &(struct country_t) { "United States of America", "America" }, 
    &(struct country_t) { "England",     "Europe" }, 
    &(struct country_t) { "Ethiopia",     "Africa" }, 
}; 

El estándar ilustra punteros a estructuras con una llamada a función. Tenga en cuenta que no todos los compiladores C aceptan la sintaxis C99, y estos literales compuestos no estaban presentes en C89 (también conocido como C90).

Edit: Actualizada para utilizar códigos de país ISO 3166 de 2 letras. También hizo que las estructuras nombradas se convirtieran en variables estáticas, esos símbolos no eran visibles fuera del archivo antes (porque no existían) y ahora tampoco son visibles fuera del archivo. Debatí si hacer algo const y decidí no hacerlo, pero usar const cuando puedes es generalmente una buena idea. Además, en el ejemplo, hay 3 países en 3 continentes. Si tuviera varios países en un solo continente (la norma), es posible que desee poder compartir las cadenas continentales. Sin embargo, si puede hacerlo de forma segura (o no) depende de los detalles del struct country_t (que no se dieron), y de si el programa tiene permiso para actualizar la tabla (que vuelve a la pregunta de la constidad).

+1

En el primer ejemplo, debería marcar todas las estructuras como 'estáticas': no deberían necesitar ser visibles fuera de la unidad de compilación actual, y están saturando los enlaces espacio de nombres ahora. – ephemient

+0

Estoy de acuerdo: decidí no complicar la respuesta con ese detalle, aunque codificaba la solución para mi propio trabajo, todo lo que podría ser estático (invisible fuera del archivo) sería. –

0

Esto funciona para mí:


struct country_t { 
    char *fullname; 
    char *shortname; 
}; 

struct country_t countries[] = { 
     {"United States of America", "America"}, 
     {"England", "Europe"}, 
     {"Ethiopia", "Africa"} 
}; 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

Se podría ser más conciso y uso:


struct country_t { 
    char *fullname; 
    char *shortname; 
} countries[] = { 
     {"United States of America", "America"}, 
     {"England", "Europe"}, 
     {"Ethiopia", "Africa"} 
}; 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

Editar: encontré esta información en The C Book

+2

La pregunta requiere una serie de punteros a las estructuras, lo que significa que su respuesta pierde el sentido, ¿no es así? –

+2

Además, * Europa * es el nombre abreviado de * Inglaterra *? Nooooo waaay! :-) – Jens

Cuestiones relacionadas