那么,差异正是如此.空指针初始化为null,因此定义了含义.您可以将其检查为null,并且取消引用它(在我知道的所有平台上)会导致程序崩溃并进行有意义的诊断.您还可以在某些特定的黑客中使用空指针.另一方面,单位指定的指针只是随机的,应该避免.
接受答案后
void foo(void) {
void *uninitialized_pointer;
void *null_pointer = null_pointer_generator();
...
}
Run Code Online (Sandbox Code Playgroud)
uninitialized_pointer在未初始化的. 它可能有一个有效的指针值。它可能具有与 相比的值NULL。它可能没有任何指针值。C 甚至没有定义的方法来复制或打印其值。
// These are undefined behavior.
void *another_pointer = uninitialized_pointer;
unsigned x = uninitialized_pointer*0;
printf("%p\n", uninitialized_pointer);
Run Code Online (Sandbox Code Playgroud)
代码可以分配uninitialized_pointer、计算其大小或传递其地址。
// These are defined behavior.
uninitialized_pointer = malloc(1);
uninitialized_pointer = NULL;
printf("%zu\n", sizeof uninitialized_pointer);
foo(&uninitialized_pointer);
Run Code Online (Sandbox Code Playgroud)
该变量的值与空指针常量null_pointer(见下文)相当,因此在空指针中。空指针可能是唯一的位模式,或者系统中可能有很多。它们与空指针常量以及彼此之间的比较都是平等的。空指针可能是也可能不是系统中的有效地址,尽管它不会与程序中的任何对象、变量、成员、函数进行同等比较。
尝试取消引用空指针是未定义的行为:它可能会导致段错误 - 也可能不会。
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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10339 次 |
| 最近记录: |