【问题标题】:what happens when assigning a null character?分配空字符时会发生什么?
【发布时间】:2011-12-17 11:33:14
【问题描述】:

当我执行以下操作时,内存中会发生什么:
在 C 中:char *c=NULL;
在 java 中:MyClass mc=null;
内存中发生了什么,这null 在这两种语言的内存中如何表示?谢谢

【问题讨论】:

  • 在 Java 中,您不能说“空字符”。它是一个空值。
  • 在 C 中,您需要至少包含几个标题之一,以便 NULL 以您认为的含义存在。 NULL 是一个通用标识符,可以表示程序员想要的任何东西(它不应该)。
  • C 中的空字符是一个完全不同的概念,与您的示例相比,您的问题的标题完全错误。

标签: java c memory null


【解决方案1】:

在 C 中,您基本上是将指针设置为零值。其实

char *c = NULL;

等价于

char *c = 0;

零指针不能被取消引用,因为该地址没有内存映射。在具有虚拟内存的平台上,尝试这样做会触发页面错误,将控制权转移到操作系统,然后操作系统通常会通过杀死有问题的进程来处理这种情况(在 UNIX 中,您的进程会收到 Segmentation Violation 信号SIGSEGV)。

在 Java 中,所有非原始类型变量都是引用。 Java 中的null 是一个文字,表示特殊未命名类型的唯一值。此类型可以转换为任何引用类型,允许您将null 放入任何引用变量中。尝试使用此类引用访问对象将引发名为 NullPointerException 的未经检查的异常。详情请参阅JLS 3.10.7JLS 4.1

【讨论】:

  • @Will,在大多数操作系统上,它会触发页面错误。在某些情况下,通常什么都没有发生或发生什么可怕的事情,但没有页面错误。
  • 没错。一些实时和嵌入式操作系统不使用虚拟内存,因此不会发生页面错误。甚至一些现代主流操作系统(如 Linux)甚至可以配置为不使用虚拟内存,但这用于专门的嵌入式应用程序,通常在没有 MMU 的硬件上运行。 DSP 是这里的一个常见示例。我把文字写得更清楚了。
【解决方案2】:

您在这里所做的是将一个字符指针分配给NULL

它具有基本相同的效果,不同之处在于,在 C 中取消引用 NULL 将使您的程序以 SIGSEGV 死掉(好吧,在类 Unix 操作系统下,包括 Linux 和 Mac OS X),而 Java 会抛出NullPointerException

请注意,mc 实际上是一个引用,而不是一个类本身。它与 C 指针几乎相同。

无论如何,NULL 在这两种情况下都有一些实用价值:您可以在 Java 中测试if (mc == null)。在 C 中,这将是一个简单的 if (!p)(但 if (p == NULL) 也可以)。

【讨论】:

    【解决方案3】:

    您可以在以下帖子中找到答案:

    What exactly is null in Java memory
    Java - Does null variable require space in memory

    所以基本上,null 本身不占用空间,但等于 null 的对象确实占用空间

    【讨论】:

      【解决方案4】:

      NULL 是一个特殊值,表示该位置没有数据,它的具体表示可能会有所不同。在 C 中它只是 0,我很确定 java。

      【讨论】:

      • 不,NULL 和其他地址一样。这对于测试来说非常方便,因为您可以测试 if (!p) 其中 p 为 NULL。
      • 在 C 中,空指针的概念可以用几种方式表示:最常用的方式是NULLNULL 不一定是0);其他方式为0(void*)0。两个空指针值比较彼此相等,无论它们是如何得到它们的值。
      • 他不是只问 C,我只是想给出一个一般性的答案。
      猜你喜欢
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 2010-12-09
      • 2015-11-22
      • 2014-12-20
      相关资源
      最近更新 更多