punteros puntero operaciones ejemplos ejemplo dev con cadenas arreglos apuntadores c pointers struct

operaciones - punteros en c ejemplos



¿Cómo puedo inicializar una matriz de punteros para estructurar? (2)

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; }

Podrías ser más conciso y usar:

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

¿Es posible inicializar una matriz de punteros a estructuras? Algo como:

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

Quiero hacer eso para obtener las entidades en la memoria no contigua, y los punteros a ellas en la memoria contigua ... Pero no puedo usar memoria dinámica, así que me pregunto si es posible sin ella.


Bueno, tu código usa estructuras en lugar de indicadores para las estructuras. Hay formas de hacer lo que busca, que incluyen:

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. La Sección 6.5.2.5 ''Literales Compuestos'' muestra la forma:

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).

Editar: actualizado para usar 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 manera segura (o no) depende de los detalles de la struct country_t (que no se dieron), y de si el programa tiene permiso para actualizar la tabla (que vuelve a la pregunta de const-ness) .