You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体中数组赋值疑问:为何直接赋值会实现数组深拷贝?

结构体中数组赋值为何是深拷贝?

首先明确结论:结构体对象赋值时,会完整复制其包含的数组所有元素,本质是逐字节的值拷贝,并非浅拷贝。

核心原因拆解

  • 数组是嵌入结构体的实体,不是指针
    结构体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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:34:57