锯齿数组赋值异常:修改test[0][0]为何影响所有子数组?
问题原因解析:为什么修改单个锯齿数组元素会影响所有子数组?
问题出在Array.Fill的使用方式上:
- 你执行
Array.Fill<double[]>(test, new double[32])时,new double[32]仅会执行一次,生成一个唯一的长度为32的double数组实例。 Array.Fill的作用是把这个同一个数组实例的引用,批量赋值给test数组的每一个元素。这意味着test[0]、test[1]……test[1999]指向的都是内存中同一个数组对象。
所以当你执行test[0][0] = 10时,本质是修改了这个共享数组的第0个元素,所有指向它的test子数组自然都会看到这个变化,导致所有[][0]都变成了10。
正确的写法
要让每个子数组都是独立的实例,需要循环为每个test[i]创建新数组:
double[][] test = new double[2000][]; for (int i = 0; i < test.Length; i++) { test[i] = new double[32]; } test[0][0] = 10;
这样每个test[i]都指向不同的数组实例,修改test[0][0]就只会影响第一个子数组。
内容的提问来源于stack exchange,提问作者user8677843
相关产品推荐
相关产品推荐

