【发布时间】:2016-04-29 07:03:08
【问题描述】:
我对 c 语言中的 void 指针有疑问。我想知道我们能否在不知道 type 的情况下取消引用 void 指针?
【问题讨论】:
-
@hacks:这不仅仅是未定义的行为,而是违反了约束。
-
你尝试的时候发生了什么?
标签: c
我对 c 语言中的 void 指针有疑问。我想知道我们能否在不知道 type 的情况下取消引用 void 指针?
【问题讨论】:
标签: c
不,因为你不知道如何解释相应内存空间所包含的数据。内存本身没有类型,它是包含类型信息的指针。例如,int * 指向的内存被解释为int。
当取消引用void * 时,编译器无法判断从该地址开始的字节应该被解释为哪种类型。它可以是double、unsigned long,甚至是chars 的数组。
但是,可以通过转换来取消引用 void *,因为转换运算符包含有关对象类型的信息。
【讨论】:
不,void 指针 只能在显式转换后取消引用。例如:
int a = 5;
void *b = &a;
printf(“%d\n”, *((int*)b));
【讨论】:
char *a = "s"; void *x = s; char c = *(int *)x;,对吗?
TL;DR不,你不能。
在取消引用 pointer-to-type 时,您会生成 type 的“对象”。
由于 void 不是完整类型,您不能直接取消引用 void*。这就是为什么,你需要要么
然后,您可以取消引用以获取 new 完整类型的对象。
【讨论】:
你不能。取消引用 void 指针需要事先进行显式转换。
您当然可以将其转换为任何特定类型,然后在不知道其原始类型的情况下取消引用它,但是您为什么要这样做却超出了我的范围。
【讨论】: