A structure type is defined as:
typedef struct student{
int id;
char* name;
double score;
} Student;
I construct a variable of type
In C99 standard you can assign values using compound literals:
Student s1;
s1 = (Student){.id = id, .name = name, .score = score};
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 ;-)
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.