空指针和未初始化指针有什么区别吗?这个问题在面试中被问到。请解释一下它们之间的不同。
那么,它们的区别就在于此。空指针被初始化为null,并且具有定义的含义。您可以检查它是否为空,并对其进行取消引用将(我所知道的所有平台上)导致程序崩溃并显示有意义的诊断信息。您也可以在某些特定的黑客中使用空指针。 另一方面,未初始化的指针只是随机值,应该避免使用。
拿一个未初始化的指针:
int* ptr;//points to any location in memory
拿一个空指针:
int* ptr = NULL;//normally points to 0x0 (0)
如果对其进行解引用,两者都会导致未定义的行为。 NULL
通常被定义为 0
。
NULL
被定义为0
或(void*)0
,但这并不意味着在编译时它实际上指向0x0
。 - PC Luddite接受答案后
void foo(void) {
void *uninitialized_pointer;
void *null_pointer = null_pointer_generator();
...
}
< p > 未初始化指针在未初始化状态下。它可能具有有效的指针值。它可能具有与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_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);
一个未初始化的指针存储着未定义的值。
一个空指针存储着一个已定义的值,但这个值被环境定义为不是任何成员或对象的有效地址。
好的...我为您谷歌了一下,这里是链接:Null pointer vs uninitialized pointer
NULL
定义值。C11
中,第§6.3.2.3章节如下所述:
顺便提一下,宏值为0的整数常量表达式,或者将这样的表达式转换为
void*
类型,称为空指针常量。如果将空指针常量转换为指针类型,则生成的指针被称为空指针,保证与任何对象或函数的指针比较时都不相等。
NULL
在<stddef.h>
中被定义为一个空指针常量。是的。未初始化指针和空指针是有区别的。未初始化指针可以指向任何(未知)内存位置。空指针初始化为NULL
; 这是实现定义的空指针常量。