未初始化和空指针之间的区别

Difference between uninitialized and null pointer

空指针和未初始化指针有区别吗? 这个问题是在一次采访中被问到的。 您能解释一下它们之间的区别吗?

未初始化的指针存储未定义的值。

空指针存储定义的值,但环境定义的值不是任何成员或对象的有效地址。

好的...我用谷歌搜索了一下,这是link:Null pointer vs uninitialized pointer

是的。未初始化和空指针是有区别的。未初始化的指针可以指向任何(未知的)内存位置。用 NULL 初始化的空指针;实现定义的空指针常量。

嗯,区别就在于此。 Null 指针被初始化为 null,因此具有定义的含义。您可以检查它是否为 null,并且取消引用它(在我知道的所有平台上)会导致程序崩溃并进行有意义的诊断。您还可以在某些特定的 hack 中使用空指针。 另一方面,未初始化的指针只是随机的,应该避免。

基本区别在于未初始化的指针具有不确定的值,而 NULL 指针具有 定义的 值,即 NULL

关于 NULL 指针,来自 C11,章节 §6.3.2.3

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer is guaranteed to compare unequal to a pointer to any object or function.

FWIW,宏 NULL<stddef.h> 中定义为空指针常量。

取一个未初始化的指针:

int* ptr;//points to any location in memory

取一个空指针:

int* ptr = NULL;//normally points to 0x0 (0)

如果取消引用,两者都会导致未定义的行为。 NULL 通常定义为 0.

接受答案后

void foo(void) {
  void *uninitialized_pointer;
  void *null_pointer = null_pointer_generator();
  ...
}

uninitialized_pointer 未初始化。它可能有一个有效的指针值。它可能具有与 NULL 比较的值。它可能没有 any 指针值。 C 甚至没有定义的方法来复制或打印它的值。

 // These are undefined behavior.
 void *another_pointer = uninitialized_pointer;
 unsigned x = uninitialized_pointer*0;
 printf("%p\n",  uninitialized_pointer);

代码可以分配 uninitialized_pointer、计算其大小或传递其地址。

 // These are defined behavior.
 uninitialized_pointer = malloc(1);
 uninitialized_pointer = NULL;
 printf("%zu\n", sizeof uninitialized_pointer);
 foo(&uninitialized_pointer);

变量null_pointer的值与空指针常量(见下文)相等一个 空指针 空指针 可能是唯一的位模式,或者系统中可能有很多。它们 all 空指针常量 以及彼此之间的比较相同。 空指针可能是也可能不是系统中的有效地址,尽管它不会与程序中的任何对象、变量、成员、函数进行同等比较。

尝试取消引用 空指针 是未定义的行为:它可能会导致段错误 - 它可能不会。


NULL 空指针常量 。当分配给一个指针时,该指针是一个 空指针 。当 0 被分配给一个指针时,该指针是一个 空指针 。这些 may/may 没有不同 空指针 。他们将平等地相互比较。

  void *null_pointer1 = NULL;
  void *null_pointer2 = 0;
  // The 2 pointer may/may not have the same bit pattern.
  printf("%p\n%p\n", null_pointer1, null_pointer2);

  // They will always compare as equal.
  printf("%d\n", null_pointer1 == null_pointer2);

  // Always compare as unequal.
  int x;
  printf("%d\n", null_pointer1 == &x);