Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 未初始化指针和空指针之间的差异_C_Pointers_Null - Fatal编程技术网

C 未初始化指针和空指针之间的差异

C 未初始化指针和空指针之间的差异,c,pointers,null,C,Pointers,Null,空指针和未初始化指针之间有什么区别吗? 这个问题是在一次采访中提出的。 您能解释一下它们之间的区别吗?未初始化的指针存储未定义的值 空指针存储定义的值,但环境定义的值不是任何成员或对象的有效地址 好的。。。我用谷歌搜索了一下,这里有链接:是的。未初始化指针和空指针之间存在差异。未初始化的指针可以指向任何(未知)内存位置。用null初始化的空指针;实现定义了空指针常量。好吧,区别就在于此。Null指针初始化为Null,因此具有定义的含义。您可以检查它是否为null,并且(在我所知道的所有平台上)取

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

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

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


好的。。。我用谷歌搜索了一下,这里有链接:

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

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

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

关于空指针,参见第§6.3.2.3章C11

值为0的整型常量表达式或转换为类型
void*
的此类表达式称为空指针常量。如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证比较不相等 指向任何对象或函数的指针


FWIW,宏
NULL
中定义为空指针常量。

使用未初始化的指针:

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();
  ...
}
未初始化\u指针处于未初始化状态。它可能有一个有效的指针值。它的值可能与
NULL
相比较。它可能没有任何指针值。C没有定义的方法来复制或打印它的值

 // These are undefined behavior.
 void *another_pointer = uninitialized_pointer;
 unsigned x = uninitialized_pointer*0;
 printf("%p\n",  uninitialized_pointer);
代码可以分配未初始化的指针,计算其大小或传递其地址

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

变量
null\U pointer
的值与null pointer常量(见下文)的值相等,因此在null指针中也是如此。空指针可以是唯一的位模式,也可以是系统中的许多位模式。它们都与空指针常量进行相等的比较,并且相互比较。空指针可能是也可能不是系统中的有效地址,尽管它不会与程序中的任何对象、变量、成员或函数进行同等比较

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


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

那么,你不再知道DOS了?或者任何嵌入式系统?因为这些不太可能在滥用空指针时立即崩溃。我的DOS经验非常有限。我对嵌入式系统没有任何经验。
NULL
只是一个概念。它在C中由
0
表示,但这并不一定意味着它指向地址0x0。但事实并非如此。NULL在语言中定义为0,但在编译时,它可能指向硬件定义为NULL的其他地方。该语言仅保证NULL指针(无论它可能由什么地址表示)不同于任何有效指针。@Joe我确信MSVC中的
NULL
定义为
0
(void*)0
,但这并不意味着在编译时它实际上指向
0x0
@NDeepK并不准确。使用未初始化的指针是未定义的行为,但取消引用空指针也是未定义的行为(两者都可能导致崩溃)。不同之处在于,未初始化的指针可以是任何东西,但空指针有一个确定的值(即
NULL
)@MSU_Bulldog先生,即使我在谷歌上搜索过它,但无法理解空指针定义中提到的“由环境定义”的含义。这是否意味着变量的地址不能为0(null)?在大多数情况下,是的。除非您特别指定它为NULL。@NDeepK它意味着NULL指针保证与任何其他指针不同。环境定义了它是什么。@NDeepK是正确的。它可以被赋值为0或其他值,这取决于环境对指针的定义。因此,永远不要假设它为0或NULL。