Why Array Memberwise Assignment is Only Supported Within Structs
Unlike arrays in general, arrays defined within structs enjoy memberwise assignment. While assigning an array to another is not permitted (__
num1 = num2;//), it becomes feasible within structs (
struct1 = struct2;//__), as shown below:
int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1;
Historical and Philosophical Rationale
This disparity stems from the evolution of C. In early iterations, arrays were essentially pointers without size information. This hindered their assignment, as the compiler lacked the necessary data. Nevertheless, arrays within structs benefited from exceptional treatment, inheriting their type and size information from the enclosing struct. As a result, they could be assigned memberwise within the struct's context, unaffected by the general constraints.
This practice was carried over to modern C and C , a quirk that solves the implementation challenges of assigning open arrays. Introducing general array assignment would have introduced ambiguity and compatibility issues. So, the limitation was maintained, and programmers were encouraged to use memcpy for explicit array copying.
Exceptions
Function parameters have emerged as another setting where array members can be assigned. Consider the following code:
typedef int vec[3]; void f(vec a, vec b) { a = b; // pointer assignment }
Although a is a pointer parameter, the assignment effectively performs an element-wise copy, despite being outside a struct. This exception is essentially an enhancement that allows for value semantics in function calls.
The above is the detailed content of Why Can't I Assign Arrays Directly, But I Can Within Structs in C/C ?. For more information, please follow other related articles on the PHP Chinese website!