Frankie
Frankie

Reputation: 483

Assign values to structure variables

A structure type is defined as:

typedef struct student{
    int id;
    char* name;
    double score;
} Student;

I construct a variable of type Student and I want to assign values to it. How can I do that efficiently?

int main(){
    Student s1;

    int id = 3;

    char* name = getName(id);

    double score = getScore(id);

    /*Error
    s1 = {id, name, score};
    */

    /*  Can I avoid assigning values individually?
    s1->id = id;
    s1->name = name;
    s1->score= score;
    */

    return 0;
}

Upvotes: 43

Views: 198646

Answers (3)

Alexander Ushakov
Alexander Ushakov

Reputation: 5399

In C99 standard you can assign values using compound literals:

Student s1;
s1 = (Student){.id = id, .name = name, .score = score};

Upvotes: 147

Serge Ballesta
Serge Ballesta

Reputation: 148965

Beware, struct and pointer to struct are 2 different things.

C offers you:

  • struct initialization (only at declaration time):

    struct Student s1 = {1, "foo", 2.0 }, s2;
    
  • struct copy:

    struct Student s1 = {1, "foo", 2.0 }, s2;
    s2 = s1;
    
  • direct element access:

    struct Student s1 ;
    s1.id = 3;
    s1.name = "bar";
    s1.score = 3.0;
    
  • manipulation through pointer:

    struct Student s1 = {1, "foo", 2.0 }, s2, *ps3;
    ps3 = &s2;
    ps3->id = 3;
    ps3->name = "bar";
    ps3->score = 3.0;
    
  • initialization function:

    void initStudent(struct Student *st, int id, char *name, double score) {
        st->id = id;
        st->name = name;
        st->score = score;
    }
    ...
    int main() {
        ...
        struct Student s1;
        iniStudent(&s1, 1, "foo", 2.0);
        ...
    }
    

Pick among those (or other respecting C standard), but s1 = {id, name, score}; is nothing but a syntax error ;-)

Upvotes: 41

Caleb
Caleb

Reputation: 125007

Can I avoid assigning values individually?

You can if the values are already part of a similar struct, that is, you can do this:

Student s1 = {.id = id, .name = name, .score = score};

which creates an instance of Student and initializes the fields you specify. This probably isn't really any more efficient than assigning values individually, but it does keep the code concise. And once you have an existing Student instance, you can copy it with simple assignment:

Student s2;
s2 = s1;    // copies the contents of s1 into s2

If the values are all in separate variables and you're not initializing the Student, then you'll probably need to assign the values individually. You can always write a function that does that for you, though, so that you have something like:

setupStudent(s3, id, name, score);

That'll keep your code short, ensure that the struct is populated the same way every time, and simplify your life when (not if) the definition of Student changes.

Upvotes: 7

Related Questions