5 ms·
Perhaps I am missing something in the spec - but trying this in various compilers, it seems that you *can* assign structs holding arrays to one another, but you
by mytherin 4y ago
Perhaps I am missing something in the spec - but trying this in various compilers, it seems that you *can* assign structs holding arrays to one another, but you *cannot* assign arrays themselves.
This compiles:
struct BigStruct {
int my_array[4];
};
int main() {
struct BigStruct a;
struct BigStruct b;
b = a;
}
But this does not:
int main() {
int a[4];
int b[4];
b = a;
}
That seems like an arbitrary restriction to me.
- poepie 4y agoIn the first example a & b are variables, which can be assigned to each other. In the second a & b are pointers, but b is fixed, so you can not assign a value to it.
- yakubin 4y agoThey’re not pointers. sizeof a == 4*sizeof(int), not sizeof(int*).
- chipsa 4y agoThey're pointers, just weird ones. The compiler knows it's an array, so it gives the result of the actual amount of space it takes up. If you passed it into a function, and used the sizeof operator in the function, it'd give `sizeof(int *)`. Because sizeof is a compile-time operation, so the compiler still knows that info for your example.
- yakubin 4y agoThat jest means it decays into a pointer after being passed as a function argument. In the example given however it’s not a pointer. Just like it wouldn’t be inside a struct.
- fsociety 4y agoEssentially ‘b = a’ in the second example is equivalent to ‘b = &a[0]’ or assigning an array to a pointer. This is because if you use an array in an expression, it’s value is (most of the time) a pointer to the array’s first element. But the left element is not an expression, therefore it is referring to b the array. Example one works because no arrays are referred to in the expression side, so this shorthand so to speak is avoided. Arrays can be a painful edge in C, for example variable length arrays are hair pulling.
- int_19h 4y agoThe left side of assignment in C is an expression. it's just not in a context where array-to-pointer decay is triggered.