繁体   English   中英

对Java和C#中的多维数组有疑问吗?

[英]Questions about the multi-dimension array in Java and C#?

在Java或C#编程语言中,我们可以像下面这样声明多维数组:

int[][] arr = new int[2][];
arr[0] = new int[3];
arr[1] = new int[4];

我想知道代码内部的内存分配机制,尤其是它们与C编程语言之间的区别吗?

我只能从Java的角度进行讨论,但是我相信C#的工作方式几乎相同(如果不是这种情况,请纠正我)。

声明和分配数组与在执行的什么时候完成什么有区别。

声明数组类型的变量时,它包含对对象的引用。 这不会创建数组对象或为其组件分配空间,而不会为变量本身分配空间。 但是初始化程序可以创建一个数组,该数组然后成为变量的初始值。 例如:

//only has a variable of firstArray (i.e. doesn't create array,
//therefore array memory not used)

int[] firstArray; 

//creates variable secondArray and allocates 4 int
//values to the array

int[] secondArray = { 1, 2, 3, 4 }; 

参考: (§10.2)JLS

当分配一个没有特定值的数组时,所有元素都将接收该数组数据类型的默认值(例如,对于布尔值,它将为false;对于整数,它将为0,等等)。例如:

//Creates an array of 5 Object's which will all
//be null.

Object[] objectArray = new Object[5];  

参考: (§8.3)(§10.2) JLS

这也是一些多维数组示例:

//This is allocating an int[] array inside myArray at position [0]
int[][] myArray = { { 1, 2 } };

for (int[] i : myArray)
    for (int j : i)
      System.out.println(j);  //will print 1 then 2;

要使用您的示例之一:

//This is declaring a multi-dimensional array of int with a max length of 2
int[][] arr = new int[2][]; //Only declaration, no memory allocation for array components

arr[0] = new int[] {1, 2};  //Allocating memory
arr[1] = new int[] {3, 4};  //Allocating memory

for(int[] i : arr)
  for(int j: i)
    System.out.println(j);  //Will print 1 then 2 then 3 then 4...

由于使用的是常量,因此编译器(应该)将所有请求合并为一个分配,并只需在可执行文件本身(.bss节)中创建一个静态块即可为数组保留内存。 对于动态分配,可能(在幕后)使用malloc为数组分配内存。 对于动态大小的数组,语言(例如C#和Java)还具有其他需要存储的元数据(例如大小),因此我无法真正告诉您它将使用多少内存。 我相信由于运行时范围检查,静态大小的数组也需要大小。

这不是一个完整的答案,但是Java虚拟机有自己的指令来分配多维数组。 请参阅Java虚拟机规范中的 multianewarray

如果调用new int[1][2][]则编译器将生成具有multianewarray指令的字节码,其尺寸为1和2,类型为int [] [] []。

在Java中,所有这些分配都在堆上,因此您的代码与C代码相同:

int **arr=malloc(2*sizeof(int*));
arr[0]=malloc(3*sizeof(int));
arr[1]=malloc(4*sizeof(int));

编辑:我不是Java专家,但是我认为在Java中,新数组的成员被初始化为0(或null),因此calloc比malloc(在我的代码中)更正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM