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

C#:定义交错数组为何需使用中间一维数组?

解惑:交错数组赋值的引用陷阱

嘿,这个问题我刚入行的时候也踩过一模一样的坑!核心点就在交错数组的本质是「数组的引用集合」,不是数组本身的副本,咱们一步步拆解:

为什么直接赋值会得到10个重复的数组?

先还原一下你大概率写的原代码(以C#为例,其他支持交错数组的语言逻辑完全一致):

int[][] jaggedArr = new int[10][];
// 只创建一次数组对象
int[] singleArray = new int[3];

for (int i = 0; i < 10; i++)
{
    // 给这个数组塞不同的值
    singleArray[0] = i;
    // 把它赋值给交错数组的每一项
    jaggedArr[i] = singleArray;
}

你以为是把数组的“内容”存进了交错数组,但实际上,交错数组的每个元素存的是指向数组的内存地址(引用)。上面的代码里,你从头到尾只创建了一个singleArray对象,循环里只是把同一个引用重复塞给了交错数组的10个位置。最后你看到的10个“副本”,其实全都是指向同一个数组——自然显示的都是最后一次修改的结果。

为什么用中间变量每次新建就正常?

再看你的修正代码:

int[][] jaggedArr = new int[10][];

for (int i = 0; i < 10; i++)
{
    // 重点!每次循环都新建一个数组实例
    int[] newArray = new int[3];
    newArray[0] = i;
    jaggedArr[i] = newArray;
}

这里每次循环都用new int[3]创建了一个全新的数组对象,每个对象都有自己独立的内存空间。交错数组的10个元素分别指向这10个不同的对象,所以每个数组的内容都是独立的,不会互相覆盖。

敲黑板划重点

交错数组里的每一项都是「引用」,不是数组的副本:

  • 若重复赋值同一个数组引用,所有项都会指向同一个数组;
  • 只有每次创建新的数组实例,才能让交错数组的每一项持有独立的数组。

内容的提问来源于stack exchange,提问作者Era

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:20:25