c-空指针和空指针有什么区别?

空指针和空指针之间有什么区别?

Pavitar asked 2019-10-09T18:40:20Z
9个解决方案
108 votes

空指针是指针的特殊保留值。 任何类型的指针都有这样的保留值。 形式上,每种特定的指针类型(2562027219749176363、void *等)都有自己的专用空指针值。 从概念上讲,当指针具有该null值时,它就不会指向任何地方。

空指针是一种特定的指针类型-void *-指向存储中某个数据位置的指针,没有任何特定类型。

因此,再次,空指针是一个值,而空指针是一个类型。 这些概念是完全不同且不可比的。 从根本上说,这意味着您的问题并不完全有效。 例如,就像问“三角形和汽车有什么区别?”。

AnT answered 2019-10-09T18:40:45Z
11 votes

它们是两个不同的概念:“ void指针”是一种类型(void *)。 “空指针”是值为零(NULL)的指针。 例:

void *pointer = NULL;

那是一个NULL无效指针。

vanza answered 2019-10-09T18:41:15Z
4 votes

保证空指针不等于指向任何对象的指针。 它的实际值取决于系统,并且可能因类型而异。 要获取空malloc指针,您需要执行以下操作

int* p = 0;

如果失败,将由malloc返回空指针。

我们可以通过测试其布尔值来测试指针是否为空,即malloc或其他函数是否失败:

if (p) {
    /* Pointer is not null */
} else {
    /* Pointer is null */
}

空指针可以指向任何类型,由您决定要处理引用的对象消耗多少内存,以进行解引用和指针运算。

aaronasterling answered 2019-10-09T18:42:00Z
3 votes

空是指类型。 基本上,它指向的数据类型是未知的。

空是指该值。 它本质上是什么都没有的指针,并且无效。

Shawn D. answered 2019-10-09T18:42:30Z
2 votes

空指针点的值为NULL,通常为0,但在任何情况下都无效,无法进行解引用。 void指针指向void类型的数据。 单词“ void”并不表示指针引用的数据无效或指针已无效。

Jesse Dhillon answered 2019-10-09T18:42:55Z
1 votes

通常,空指针(可以是任何类型,包括空指针!)都指向:

  • 地址0,大多数CPU指令集可以针对该地址进行非常快速的比较和分支(例如,检查未初始化或无效的指针),并且具有ISA的最佳代码大小/性能。

  • 一个用户代码无法访问的地址(例如在许多情况下为0x00000000),因此,如果代码实际上试图访问该地址或该地址附近的数据,则OS或调试器可以轻松地通过此bug停止或捕获程序。

空指针通常是一种作弊或关闭编译器类型检查的方法,例如,如果您想将一个指针返回到一种类型或未知类型,以用作另一种类型。 例如,malloc()返回一个空指针,指向一个无类型的内存块,您可以将该类型的指针转换为以后用作字节,短整数,双浮点数,typePotato的指针。

hotpaw2 answered 2019-10-09T18:43:40Z
1 votes

NULL是对于任何指针类型均有效的值。 它表示没有值。

空指针是一种类型。 任何指针类型都可以转换为空指针,因此可以指向任何值。 这对于一般存储来说是好的,但不好用。 它本身不能用于访问值。 程序必须具有额外的上下文,才能理解空指针所引用的值的类型,然后才能访问该值。

JaredPar answered 2019-10-09T18:44:11Z
1 votes

空指针和空指针彼此完全不同。 如果我们请求操作系统(通过c语言中的malloc())为特定数据类型分配内存,则操作系统将在堆中分配内存(如果堆中有可用空间)并发送已分配的内存地址。

当内存由os在堆中分配时,我们可以在该数据类型的任何指针类型变量中分配该地址值。 然后将此指针称为空指针,直到任何进程都不会使用它为止。

当堆中没有可用空间时,操作系统当然会分配内存并发送该位置的地址值,但由于堆中没有空间,因此操作系统不会在堆中分配此内存,在这种情况下,该内存由 用户无法访问此内存,因此当我们在指针中分配此地址值时,该指针称为空指针,因此无法使用该指针。 对于void指针,我们可以将其用于任何编程语言的任何进程。

Ghulam Rabbani answered 2019-10-09T18:44:50Z
0 votes

我认为AnT的答案不正确。

  1. NULL只是一个指针常量,否则我们怎么会有(void *)
  2. NULL是一个指针,它的类型是什么。 我认为类型只是(void *),否则我们怎么可能同时拥有NULL(user-defined type)* ptr = NULLvoid类型实际上是一个通用类型。
  3. 在“ C11(ISO / IEC 9899:201x)§6.3.2.3指针第3节”中引用:

    值为0的整数常量表达式,或强制转换为void *类型的表达式,称为空指针常量

简而言之:NULL指针是一个空指针常量。

nathan answered 2019-10-09T18:45:48Z
translate from https://stackoverflow.com:/questions/3581585/whats-the-difference-between-a-null-pointer-and-a-void-pointer