-1

我想知道两者有什么区别

int []  arr1=null;

int [] arr1=int [5];

关于内存分配?我在某处读到 null 是一个引用变量,因此堆中有一个内存分配,但我认为这int[]也是一个引用变量,不是吗?所以还是有区别的?

一般来说,我可以在 Java/C++ 中的哪些分配示例中看到堆内存和堆栈内存分配之间的区别?

4

7 回答 7

4

您提出问题的原因如下图所示
在此处输入图像描述

在 JAVA 在 Java 中

int [] arr1=int [5];在java中无效

于 2013-06-19T08:21:25.153 回答
4

线

int[]  arr1=null;

只是创建作为arr1数组引用的变量。引用是null,所以只分配了引用本身。它猜测它大约是 4 个字节。

然而

int[] arr1= new int[5];

额外分配一个包含 5 个整数的数组,即额外的4*5字节。完全4 + 4*5 = 24字节。

于 2013-06-19T08:06:22.873 回答
2

在 C++ 中,此语法无效,但将其更改为:

int * arr1=nullptr;

int * arr2=new int [5];

它基本上做同样的事情:

arr1我的示例中,它是指向某些内存的引用/指针,当前不引用/指向任何内容。

arr2引用/指向一个由 5 个整数组成的数组,这些整数在堆上分配。

如果在稍后阶段,我们需要arr1指出十个整数,我们可以(再次,在 C++ 中)这样做:

arr1 = new int[10];

在 C++ 中,您还必须使用delete以下值:

delete [] arr2; 

delete [] arr1; 

请注意,删除指向 null 的内容是有效的,但删除未初始化的指针是无效的。

于 2013-06-19T08:10:11.360 回答
1

在 Java 中,

int [] arr1=int [5];

它创建了数组对象(因为在 java 中,数组被认为是对象)和内存中用于5primitive( int)元素的空间。并将每个原始元素初始化为默认值(0对于 int)。最后将该对象的引用提供给引用变量arr1

int []  arr1=null;

只创建一个arr1没有指向任何东西的引用变量。此行指定arr1将来可能包含将包含原始整数数组的对象的引用。

于 2013-06-19T08:25:54.617 回答
1

null 是 Java 的说法,它没有分配任何堆或没有指向任何东西。在第二个版本中,java 在堆上分配 5 个整数的数组,并让您的变量 arr1(在堆栈上 btw)指向它。

于 2013-06-19T08:06:44.143 回答
1

不同之处在于第二个版本分配了一个五元素int数组,而第一个版本没有。

还为引用本身预留了内存arr1,但这两种情况都是一样的。

于 2013-06-19T08:05:04.670 回答
0

只谈java。

int[] 的类型没有任何 int 实例。它是 int 数组的指针。所以它可以指向int数组的实例。

public class Foo {
    public static void main(String[] args) {
        int[] a, b, c;

        a = new int[] {1,2,3,4,5};
        b = new int[] {1,2,3,4,5,6};
        c = a;
        System.out.println(c.length);
        c = b;
        System.out.println(c.length);
    }
}

a, b 是 int 数组的指向实例。在上面的最后一行代码中,c 和 b 指向同一个实例。

于 2013-06-19T08:09:54.907 回答