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

时间:2015-08-25 18:37:32

标签: c pointers null

空指针和未初始化指针之间有什么区别吗? 其中一次采访中提到了这个问题。 你能解释一下他们有什么区别吗?

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

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

好的......我用Google搜索了它,下面是链接:Null pointer vs uninitialized pointer

答案 2 :(得分:3)

取一个未初始化的指针:

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

取空指针:

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

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

答案 3 :(得分:3)

接受回答后

void foo(void) {
  void *uninitialized_pointer;
  void *null_pointer = null_pointer_generator();
  ...
}
未初始化中的

uninitialized_pointer 。它可能有一个有效的指针值。它可能具有与NULL比较的值。它可能没有任何指针值。 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 空指针常量相互比较。 空指针可能是也可能不是系统中的有效地址,尽管它不会与程序中的任何对象,变量,成员和函数进行同等比较。

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

NULL空指针常量。分配给指针时,该指针是空指针。将0分配给指针时,该指针是空指针。这些可能/可能不是空指针。他们将相互比较。

  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);

答案 4 :(得分:2)

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