C - 空指针能否安全地指向其他指针


这可能

很明显,但是,一个空指针可以安全地指向另一个指针吗?即指向一个类型int *

int i = 5;
int *ip = &i;
void *vp = &ip;
int *nip = *(int **)vp;
int ni = *nip; // == 5?

编辑:对不起,也许我不清楚,我想知道一个空指针是否可以指向具有另一个指针类型的内存部分;而不是一个空白**。 只是无效 *

是的,您可以将任何对象指针转换为void *并转换回原始指针类型,而不会丢失信息。

从马的嘴里:

(C99, 6.3.2.3p1)"指向 void 的指针可以转换为指向任何不完整或对象类型的指针。指向任何不完整或对象类型的指针可以转换为指向 void 的指针,然后再返回;结果应与原始指针相等。

是的,它可以指向任何对象类型1。您实际上无法取消引用 void 指针,因为编译器不知道它背后的"真实"类型。但是指向方面很好。

C11 6.3.2.3 Pointers /1

指向

void 的指针可以转换为指向任何对象类型的指针,也可以从指向任何对象类型的指针转换。指向任何对象类型的指针都可以转换为指向 void 的指针,然后再转换回来;结果应与原始指针相等。


1/ "对象类型"不包括函数,转换函数指针的规则稍微严格一些。

最新更新