结构体中数组赋值疑问:为何直接赋值会实现数组深拷贝?
结构体中数组赋值为何是深拷贝?
首先明确结论:结构体对象赋值时,会完整复制其包含的数组所有元素,本质是逐字节的值拷贝,并非浅拷贝。
核心原因拆解
数组是嵌入结构体的实体,不是指针
结构体struct S { int arr[6]; }的内存布局里,arr直接占用6个int的连续空间,整个结构体大小是6 * sizeof(int)(比如int为4字节时就是24字节),并没有额外存储数组的指针。数组名虽然在某些场景会隐式转为指针,但数组本身是包含所有元素的实体对象。结构体赋值是值拷贝,逐成员/逐字节复制
C语言允许结构体对象直接赋值,编译器会自动生成代码完成整个结构体的逐字节拷贝。因为数组是结构体的一部分,所以数组的每一个元素都会被复制到目标结构体的对应位置,相当于对数组做了深拷贝。对比单独的数组赋值(
int a[6], b[6]; b = a;),这种写法是非法的——因为数组不是可修改的左值,不能直接赋值。但结构体赋值是语言明确支持的操作,编译器会处理内部数组的完整复制。
代码验证
#include <stdio.h> struct S { int arr[6]; }; int main() { struct S a = {1, 2, 3, 4, 5, 6}; struct S b = a; // 修改b的数组元素 b.arr[0] = 100; // 打印结果,a的元素不受影响 printf("a.arr[0] = %d, b.arr[0] = %d\n", a.arr[0], b.arr[0]); // 输出:a.arr[0] = 1, b.arr[0] = 100 return 0; }
这个例子可以清楚看到,修改b的数组元素不会影响a,说明两个数组是独立的内存空间,确实是深拷贝。
内容的提问来源于stack exchange,提问作者Unlikely1879
相关产品推荐
相关产品推荐

