Quoting C11
, chapter §6.5.3.2:
The unary *
operator denotes indirection. If the operand points to a function, the result is
a function designator; if it points to an object, the result is an lvalue designating the
object. If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’. If an
invalid value has been assigned to the pointer, the behavior of the unary *
operator is
undefined.
So, your code causes undefined behavior.
Also, related, from chapter §6.2.5:
The void
type comprises an empty set of values; it is an incomplete object type that
cannot be completed.
So, a pointer to void
is an invalid operand for dereference.
One probable practical case and the possible solution
Sometimes, for making generics, we cast a certain pointer to void *
, pass that as argument to a function and then, inside a function we cast it back to the original type, based on some known information. This is, as per chapter §6.3.2.3, perfectly valid:
[...] A pointer to
any object type may be converted to a pointer to void and back again; the result shall
compare equal to the original pointer.
If this is your case, and you're dereferencing inside the function, you can cast the pointer to either
before dereferencing.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…