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
相关产品推荐
相关产品推荐

