When I started this post, it was going to be a revolutionary post, talking about something that was really bothering me. As I have spent more time thinking about this, the answer seems so simple and obvious, still there was a time where I did not get this concept, so I here is a brief post on the topic,

The question is, in straight C, will this work:

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 `````` ``````#include #include #include typedef struct point_t { int x,y; } Point; int main(int argc, char **argv) { Point a,b; int c[4] = {1, 2, 3, 4}; b = c; printf("b(%p) is now b[x] = %d, b[y] = %dn", &b, b.x, b.y); return 0; } ``````

In C++ this works no problem. Structs are teated like classes where all members have public scope. Assigning one struct to another simple implements the copy constructor that is created by the C++ language, but what about straight C?

Well, like I said the answer is the obvious one, IT WORKS! The reason this originally confused me was because you CAN’T do this:

 ``````1 2 3 4 `````` `````` int a[4] = { 1, 2, 3, 4}; int b[4]; b = a; ``````

Why not? The compiler knows how big each of these integer arrays are. If you run `sizeof(a);` and it will give you the same thing as `sizeof(b);`. Copying an array is as simple as copying over the bytes (bit for bit), using `memset()` or something similar.

The reason structs work and arrays don’t is simple. Basically we are doing a type check on the object. If the object is a struct of defined type, we know how to do an assignment because we have the size. If the item is an array of integers, we would have to do a size comparison and the compiler doesn’t do that.

Okay, so I hope that explains the obvious, good luck.