"取消引用NULL指针"意味着什么?

Ash*_*Ash 51 c pointers

我是C的完全新手,在我的大学工作期间,我遇到了代码中的注释,这些注释通常指的是取消引用NULL指针.我有在C#中的背景下,我已经得到通过,这可能是类似于"的NullReferenceException"你是在净得到的,但现在我有严重的怀疑.

有人可以用非专业人员的术语向我解释这是什么以及它为什么不好?

Gre*_*ill 71

一个NULL指针指向了一个不存在的内存.这可以是地址0x00000000或任何其他实现定义的值(只要它永远不能是真实地址).取消引用它意味着尝试访问指针指向的任何内容.该*运营商是对其操作:

int a, b, c; // some integers
int *pi;     // a pointer to an integer

a = 5;
pi = &a; // pi points to a
b = *pi; // b is now 5
pi = NULL;
c = *pi; // this is a NULL pointer dereference
Run Code Online (Sandbox Code Playgroud)

这与NullReferenceExceptionC#中的完全相同,只是C中的指针可以指向任何数据对象,甚至是数组中的元素.

  • @Ash:指针包含*引用*的内存地址.要访问由该内存地址引用的**,您必须*取消引用*内存地址. (11认同)

Ada*_*eld 32

解除引用只意味着读取给定地址的内存值.所以,当你有一个指针的东西,要取消引用指针指来读取或写入数据的指针指向.

在C中,一元运算*符是解除引用运算符.如果x是指针,则指向的*x是什么x.一元运算&符是运算符的地址.如果x是什么,则存储在内存中&x的地址x.的*&运营商是彼此的逆:如果x是任何数据,和y是任何指针,则这些方程总是为真:

*(&x) == x
&(*y) == y
Run Code Online (Sandbox Code Playgroud)

空指针是一个指向不指向任何有效数据的指针(但它不是唯一的指针).C标准表示取消引用空指针是未定义的行为.这意味着绝对可能发生任何事情:程序可能会崩溃,它可能会继续无声地工作,或者它可能会擦除您的硬盘驱动器(尽管这不太可能).

在大多数实现中,如果您尝试这样做,将会出现"分段错误"或"访问冲突",这几乎总会导致您的程序被操作系统终止.这是空指针可以解除引用的一种方式:

int *x = NULL;  // x is a null pointer
int y = *x;     // CRASH: dereference x, trying to read it
*x = 0;         // CRASH: dereference x, trying to write it
Run Code Online (Sandbox Code Playgroud)

是的,取消引用空指针几乎就像NullReferenceException在C#(或NullPointerExceptionJava中)一样,除了langauge标准在这里有点帮助.在C#中,取消引用空引用具有明确定义的行为:它总是抛出一个NullReferenceException.你的程序无法继续静默工作或者像在C中那样擦除你的硬盘驱动器(除非语言运行时出现错误,但同样不可能这样).

  • 实际上,“NULL”指针有时确实指向有效数据。许多微控制器在地址 0 处实现闪存/外设。 (3认同)