Jak inicializovat struct v souladu s jazykovými standardy C programování

hlasů
337

Chci inicializovat struct prvek, trhlina v deklaraci a inicializaci. To je to, co mám:

typedef struct MY_TYPE {
  boolean flag;
  short int value;
  double stuff;
} MY_TYPE;

void function(void) {
  MY_TYPE a;
  ...
  a = { true, 15, 0.123 }
}

Je to způsob, jak deklarovat a inicializovat lokální proměnné MY_TYPEv souladu s normami programovacího jazyka C (C89, C90, C99, C11, atd.)? Nebo je tam něco lepšího, nebo alespoň pracují?

Aktualizujte jsem skončil s statický inicializační prvek, kde jsem nastavit každý dílčí prvek podle svých potřeb.

Položena 01/12/2008 v 14:13
zdroj uživatelem
V jiných jazycích...                            


14 odpovědí

hlasů
572

V (ANSI) C99, můžete použít určený inicializátor inicializovat strukturu:

MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 };

Edit: Další členové jsou inicializovány jako nula „Vynechané členové polí jsou implicitně inicializuje stejná jako objekty, které mají statickou dobu skladování.“ ( Https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )

Odpovězeno 01/12/2008 v 14:39
zdroj uživatelem

hlasů
153

Můžete to udělat pomocí sloučeniny doslovný . Podle této straně, že pracuje v C99 (který také počítá jako ANSI C ).

MY_TYPE a;

a = (MY_TYPE) { .flag = true, .value = 123, .stuff = 0.456 };
...
a = (MY_TYPE) { .value = 234, .stuff = 1.234, .flag = false };

Označení v Inicializátory jsou volitelné; můžete také psát:

a = (MY_TYPE) { true,  123, 0.456 };
...
a = (MY_TYPE) { false, 234, 1.234 };
Odpovězeno 01/12/2008 v 14:28
zdroj uživatelem

hlasů
80

Vidím, že jste již obdrželi odpověď o ANSI C 99, takže budu hodit kost o ANSI C 89. ANSI C 89 umožňuje inicializovat struct takto:

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = { 5, 2.2, "George" };
    return 0;
}

Důležitá věc mít na paměti, ve chvíli, kdy inicializovat ještě jeden objekt / proměnnou v struct, všechny jeho ostatní proměnné se inicializuje na výchozí hodnotu.

Pokud nechcete inicializovat hodnoty ve vaší struct, budou všechny proměnné obsahovat „hodnoty smetí“.

Hodně štěstí!

Odpovězeno 09/06/2013 v 04:51
zdroj uživatelem

hlasů
35

a = (MYTYPE){ true, 15, 0.123 };

bude stačit na C99

Odpovězeno 01/12/2008 v 14:27
zdroj uživatelem

hlasů
17

Že jste málem ho ...

MY_TYPE a = { true,15,0.123 };

Rychlé vyhledávání na ‚struct inicializovat c‘ mi to ukazuje,

Odpovězeno 01/12/2008 v 14:21
zdroj uživatelem

hlasů
12

Ron Nuni řekl:

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = {5, 2.2, "George"};
    return 0;
}

Důležitá věc k zapamatování: ve chvíli, kdy inicializovat ještě jeden objekt / proměnnou v struct, všechny jeho ostatní proměnné se inicializuje na výchozí hodnotu.

Pokud nechcete inicializovat hodnoty v struct (tj pokud jste jen prohlásit, že proměnné), vše variable.membersbude obsahovat „hodnoty smetí“, pouze v případě, že prohlášení je místní!

Je-li prohlášení globální nebo statické (jako v tomto případě), všechny neinicializované variable.membersbude automaticky inicializuje na:

  • 0 pro celá čísla a pohyblivé řádové čárce
  • '\0'pro char(samozřejmě je to stejné, jako 0, a charje celé číslo typ)
  • NULL na ukazateli.
Odpovězeno 04/09/2013 v 10:37
zdroj uživatelem

hlasů
11

C programovací jazyk norma ISO / IEC 9899: 1999 (obecně známý jako C99), umožňuje použít na určené inicializátor inicializovat členy struktury nebo svazkem takto:

MY_TYPE a = { .stuff = 0.456, .flag = true, .value = 123 };

To je definováno v paragraph 7oddíle 6.7.8 InitializationISO / IEC 9899: standardní 1999 takto:

Je-li označení má tvar
. Identifikátor
pak aktuální objekt (definovaná níže) bude mít strukturu nebo sjednocovací typ a identifikátor musí být název člena tohoto typu.

Všimněte si, že paragraph 9ze stejného oddílu se uvádí, že:

S výjimkou případů výslovně uvedeno jinak, pro účely tohoto článku se nejmenovaných členů objektů struktury a typu union nepřistoupili k inicializaci. Nejmenovaní členové struktury objektů mají neurčitý hodnotu i po inicializaci.

V GNU však realizace GCC vynechán členy jsou inicializovány jako nula nebo nulové hodnoty, jako je typově vhodné. Jak je uvedeno v sekci 6.27 Prostor Inicializátory GCC dokumentace GNU:

Vynechané členové polí jsou implicitně inicializuje stejná jako objekty, které mají statickou dobu skladování.

Microsoft Visual C ++ kompilátor by měl podporovat určené inicializátory od verze 2013 podle oficiální blog příspěvek C ++ shodnosti plánu . Bod Initializing unions and structsz Inicializátory článku na MSDN Visual Studio dokumentace vyplývá, že nejmenovaní členové nastaveny na nulovou jako odpovídající hodnoty podobně jako GNU GCC.

Nový ISO / IEC 9899: 2011 standard (běžně známý jako C11), která byla nahrazena ISO / IEC 9899: 1999 zachovává určený inicializátory podle § 6.7.9 Initialization. To také zachovává paragraph 9beze změny.

Odpovězeno 08/06/2016 v 11:43
zdroj uživatelem

hlasů
3
void function(void) {
  MY_TYPE a;
  a.flag = true;
  a.value = 15;
  a.stuff = 0.123;
}
Odpovězeno 01/12/2008 v 14:19
zdroj uživatelem

hlasů
2

Zjistil jsem, jiný způsob, jak inicializovat structs.

Struct:

typedef struct test {
    int num;
    char* str;
} test;

inicializace:

test tt = {
    num: 42,
    str: "nice"
};

Podle dokumentace GCC, tato syntaxe je zastaralá, protože GCC 2.5 .

Odpovězeno 04/12/2015 v 03:15
zdroj uživatelem

hlasů
2

Pokud MS není aktualizován na C99, MY_TYPE A = {pravda, 15,0.123};

Odpovězeno 20/04/2014 v 20:39
zdroj uživatelem

hlasů
1

Nelíbilo se mi některé z těchto odpovědí, takže jsem udělal můj vlastní. Nevím, jestli je to ANSI C, nebo ne, je to jen GCC 4.2.1 ve své výchozí režim. Nikdy jsem si vzpomenout na bracketing, takže začnu s podmnožinou mých dat a do boje s chybových zpráv kompilátor, dokud se vypne se. Čitelnost je můj první prioritou.

    // in a header:
    typedef unsigned char uchar;

    struct fields {
      uchar num;
      uchar lbl[35];
    };

    // in an actual c file (I have 2 in this case)
    struct fields labels[] = {
      {0,"Package"},
      {1,"Version"},
      {2,"Apport"},
      {3,"Architecture"},
      {4,"Bugs"},
      {5,"Description-md5"},
      {6,"Essential"},
      {7,"Filename"},
      {8,"Ghc-Package"},
      {9,"Gstreamer-Version"},
      {10,"Homepage"},
      {11,"Installed-Size"},
      {12,"MD5sum"},
      {13,"Maintainer"},
      {14,"Modaliases"},
      {15,"Multi-Arch"},
      {16,"Npp-Description"},
      {17,"Npp-File"},
      {18,"Npp-Name"},
      {19,"Origin"}
    };

Data mohou začít život jako soubor oddělený tabulátory, které jste hledat, nahradit masírovat do něčeho jiného. Ano, to je Debian věci. Takže jeden vnější dvojice {} (s uvedením pole), pak další pár pro každou struct dovnitř. Čárkami mezi. Uvedení věci v záhlaví není nezbytně nutné, ale mám asi 50 položek v mém struct tak chci je do samostatného souboru, jak udržet nepořádek ze svého kódu, a tak je to jednodušší vyměnit.

Odpovězeno 12/05/2016 v 17:14
zdroj uživatelem

hlasů
0

Hledala jsem na pěkný způsob, jak inicializaci můj struct, a musím s použitím níže (C99). To umožňuje mi inicializovat buď jediný strukturu nebo pole struktur stejným způsobem jako prostý typů.

typedef struct {
    char *str;
    size_t len;
    jsmntok_t *tok;
    int tsz;
} jsmn_ts;

#define jsmn_ts_default (jsmn_ts){NULL, 0, NULL, 0}

To může být použit v kódu jsou:

jsmn_ts mydata = jsmn_ts_default; /* initialization of a single struct */

jsmn_ts myarray[10] = {jsmn_ts_default, jsmn_ts_default}; /* initialization of
                                                    first 2 structs in the array */
Odpovězeno 02/12/2018 v 17:46
zdroj uživatelem

hlasů
0

Přečetl jsem si Microsoft Visual Studio 2015 dokumentaci pro inicializaci agregační typy přesto, všechny formy inicializace se {...}tam jsou vysvětleny, ale při inicializaci s tečkou, s názvem ‚‘ označení ‚‘ se zde nezmiňuje. Nefunguje to také.

C99 standardní kapitole 6.7.8 Inicializace vysvětluje možnost označovatelé, ale v mé mysli, že není úplně jasné, pro komplexní structs. Standardní C99 jako pdf .

V mé mysli, může to být lepší

  1. Použijte = {0};-initialization všech statických dat. To je méně snaha o strojovém kódu.
  2. Používat makra pro inicializaci, například

    typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}

Makro lze přizpůsobit její seznam argumentů může být nezávislá na změněné obsah struct. To je správné, jestliže méně prvky by měly být inicializovány. Je také vhodné, aby vnořené struct. 3. Jednoduchá forma: Inicializace v podprogramu:

void init_MyStruct(MyStruct* thiz, int a, int b) {
  thiz->a = a; thiz->b = b; }

Tato rutina vypadá jako ObjectOriented v C. použití thiz, není thisto kompilaci s C ++ taky!

MyStruct data = {0}; //all is zero!
init_MyStruct(&data, 3, 456);
Odpovězeno 12/08/2018 v 14:10
zdroj uživatelem

hlasů
0

Struktura C může být deklarována a inicializována takto:

typedef struct book
{
    char title[10];
    char author[10];
    float price;
} book;

int main() {
    book b1={"DS", "Ajay", 250.0};

    printf("%s \t %s \t %f", b1.title, b1.author, b1.price);

    return 0;
}
Odpovězeno 06/09/2017 v 18:38
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more