Initialize struct fields

Discussion in 'C Programming' started by Andi.Martin, Jul 9, 2003.

  1. Andi.Martin

    Andi.Martin Guest

    Hi,

    how is it possible, to only initialize parts of a structure.

    Example:

    typedef struct{
    int a, b;
    ... (huge lot of members);
    double x,y;
    }_s;

    _s s={a=10,x=23.0};


    This shall be done BEFORE any code is executed! I mean no initialize
    functions!

    Anyone an idea?
    Andreas
     
    Andi.Martin, Jul 9, 2003
    #1
    1. Advertisements

  2. In C99, you can use designated initializers:

    typedef struct { int a, b, c, d, e, f, g, h; } thing_t;
    thing_t os = {
    .b = 0,
    .e = 5
    };

    Tak-Shing
     
    Tak-Shing Chan, Jul 9, 2003
    #2
    1. Advertisements

  3. Andi.Martin

    Ben Pfaff Guest

    If you mean, by "initialize parts of a structure", to specify
    values for some members, and let the others receive the value 0
    or a null pointer, then you can do it in C99 using the syntax
    {.a = 10, .x = 23.0}
    If you don't have a C99 compiler, you're out of luck. I suggest
    putting the members you want to initialize at the beginning of
    the structure.

    If you mean, by "initialize parts of a structure", to specify
    values for some members, and leave the other ones indeterminate,
    there is no way to do that. C doesn't have partial
    initialization in declarations: an object is either indeterminate
    or fully initialized.

    By the way, _s is a poor choice of names. Names beginning with
    an underscore are generally reserved to the implementation.
     
    Ben Pfaff, Jul 9, 2003
    #3
  4. C99 allows:

    _s s={.a=10, .x=23.0};

    If your compiler is C90, then it is difficult. Can you move the
    members around in the structure definition so that ones to be
    initialized are first?

    BTW, don't begin identifiers with underscores. They are reserved for
    use in file scope for ordinary and tag name spaces.

    Best wishes,

    Bob
     
    Robert W Hand, Jul 9, 2003
    #4
  5. Andi.Martin

    David Rubin Guest

    Another common way to do this is to create a special instance of the structure
    which is initialized to the values you want:

    /* file scope */
    struct _s init = {0};

    /* in main */
    init.a = 10;
    init.x = 23.0;

    /* in other functions */
    struct _s s = init;

    /david
     
    David Rubin, Jul 10, 2003
    #5
  6. Andi.Martin

    Dan Pop Guest

    If you need a portable solution, your only chance is to put the members
    that need initialisation at the beginning on the structure:

    struct {
    int a;
    double x;
    ... (huge lot of members);
    } s = {10, 23.0};

    The members without an explicit initialiser will be initialised to the
    right type of zero.

    Dan
     
    Dan Pop, Jul 10, 2003
    #6
  7. IIRC in C99 you can do struct { int a; double x; /* ... */ } s = {.a = 10,
    ..x = 23.0 };
     
    Finny Merrill, Jul 10, 2003
    #7
  8. Andi.Martin

    Randy Howard Guest

    Requiring C99 for your implementation (which is by no means portable
    today) is the likely reason for Dan's alternate suggestion.
     
    Randy Howard, Jul 11, 2003
    #8
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.