未初始化和空指针之间的区别
Difference between uninitialized and null pointer
空指针和未初始化指针有区别吗?
这个问题是在一次采访中被问到的。
您能解释一下它们之间的区别吗?
未初始化的指针存储未定义的值。
空指针存储定义的值,但环境定义的值不是任何成员或对象的有效地址。
好的...我用谷歌搜索了一下,这是link:Null pointer vs uninitialized pointer
是的。未初始化和空指针是有区别的。未初始化的指针可以指向任何(未知的)内存位置。用 NULL
初始化的空指针;实现定义的空指针常量。
嗯,区别就在于此。 Null 指针被初始化为 null,因此具有定义的含义。您可以检查它是否为 null,并且取消引用它(在我知道的所有平台上)会导致程序崩溃并进行有意义的诊断。您还可以在某些特定的 hack 中使用空指针。
另一方面,未初始化的指针只是随机的,应该避免。
基本区别在于未初始化的指针具有不确定的值,而 NULL 指针具有 定义的 值,即 NULL
。
关于 NULL 指针,来自 C11
,章节 §6.3.2.3
An integer constant expression with the value 0, or such an expression cast to type void *
, is called a null pointer constant. If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer is guaranteed to compare unequal
to a pointer to any object or function.
FWIW,宏 NULL
在 <stddef.h>
中定义为空指针常量。
取一个未初始化的指针:
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();
...
}
uninitialized_pointer
未初始化。它可能有一个有效的指针值。它可能具有与 NULL
比较的值。它可能没有 any 指针值。 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 与 空指针常量 以及彼此之间的比较相同。 空指针可能是也可能不是系统中的有效地址,尽管它不会与程序中的任何对象、变量、成员、函数进行同等比较。
尝试取消引用 空指针 是未定义的行为:它可能会导致段错误 - 它可能不会。
NULL
是 空指针常量 。当分配给一个指针时,该指针是一个 空指针 。当 0
被分配给一个指针时,该指针是一个 空指针 。这些 may/may 没有不同 空指针 。他们将平等地相互比较。
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);
空指针和未初始化指针有区别吗? 这个问题是在一次采访中被问到的。 您能解释一下它们之间的区别吗?
未初始化的指针存储未定义的值。
空指针存储定义的值,但环境定义的值不是任何成员或对象的有效地址。
好的...我用谷歌搜索了一下,这是link:Null pointer vs uninitialized pointer
是的。未初始化和空指针是有区别的。未初始化的指针可以指向任何(未知的)内存位置。用 NULL
初始化的空指针;实现定义的空指针常量。
嗯,区别就在于此。 Null 指针被初始化为 null,因此具有定义的含义。您可以检查它是否为 null,并且取消引用它(在我知道的所有平台上)会导致程序崩溃并进行有意义的诊断。您还可以在某些特定的 hack 中使用空指针。 另一方面,未初始化的指针只是随机的,应该避免。
基本区别在于未初始化的指针具有不确定的值,而 NULL 指针具有 定义的 值,即 NULL
。
关于 NULL 指针,来自 C11
,章节 §6.3.2.3
An integer constant expression with the value 0, or such an expression cast to type
void *
, is called a null pointer constant. If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer is guaranteed to compare unequal to a pointer to any object or function.
FWIW,宏 NULL
在 <stddef.h>
中定义为空指针常量。
取一个未初始化的指针:
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();
...
}
uninitialized_pointer
未初始化。它可能有一个有效的指针值。它可能具有与 NULL
比较的值。它可能没有 any 指针值。 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 与 空指针常量 以及彼此之间的比较相同。 空指针可能是也可能不是系统中的有效地址,尽管它不会与程序中的任何对象、变量、成员、函数进行同等比较。
尝试取消引用 空指针 是未定义的行为:它可能会导致段错误 - 它可能不会。
NULL
是 空指针常量 。当分配给一个指针时,该指针是一个 空指针 。当 0
被分配给一个指针时,该指针是一个 空指针 。这些 may/may 没有不同 空指针 。他们将平等地相互比较。
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);