当我执行以下操作时,记忆中会发生什么:
在C:char *c=NULL;
在java中:MyClass mc=null;
在内存中会发生什么,这两种语言在内存中如何表示null
?感谢
答案 0 :(得分:4)
在C中,您基本上将指针设置为零值。事实上
char *c = NULL;
相当于
char *c = 0;
由于此地址没有内存映射,因此无法取消引用零指针。在具有虚拟内存的平台上,尝试这样做会触发页面错误,将控制转移到操作系统,操作系统通常会通过终止违规进程来处理这种情况(在UNIX中,您的进程会收到分段违例信号SIGSEGV
)。 p>
在Java中,所有非基本类型变量都是引用。 Java中的null
是一个文字,表示特殊未命名类型的唯一值。此类型可以转换为任何引用类型,允许您将null
放入任何引用变量中。尝试使用此类引用访问对象将引发一个名为NullPointerException
的未经检查的异常。有关详细信息,请参阅JLS 3.10.7和JLS 4.1。
答案 1 :(得分:1)
您在此处执行的操作是将char 指针分配给NULL
。
它具有基本相同的效果,在C中取消引用NULL将使程序死于SIGSEGV
(好吧,在类Unix操作系统下,包括Linux和Mac OS X),而巨大的区别将抛出NullPointerException
。
请注意mc
实际上是一个引用,而不是一个类本身。它与C指针几乎相同。
NULL在这两种情况下都有一些实用价值:您可以在Java中测试if (mc == null)
。在C中,这将是一个简单的if (!p)
(但if (p == NULL)
也可以)。
答案 2 :(得分:1)
您可以在以下帖子中找到答案:
What exactly is null in Java memory
Java - Does null variable require space in memory
所以基本上,null本身不占用空间,但是将对象置为null会占用空间
答案 3 :(得分:-1)
NULL是一个特殊值,表示该位置没有数据,它的具体表示可能会有所不同。在C中它只是0,我注意到了java。