In particular I'd like to know what ->val
does in the
sizeof(((stoken_t*)(0))->val)
and what stoken_t*(0)
pointer do, in particular what the (0)
means?
I hope I have formulated my question clearly enough.
In particular I'd like to know what ->val
does in the
sizeof(((stoken_t*)(0))->val)
and what stoken_t*(0)
pointer do, in particular what the (0)
means?
I hope I have formulated my question clearly enough.
This is a way of accessing a member of a structure at compile time, without needing to have a variable defined of that structure type.
The cast (stoken_t*)
to a value of 0
emulates a pointer of that structure type, allowing you to make use of the ->
operator on that, just like you would use it on a pointer variable of that type.
To add, as sizeof
is a compile time operator, the expression is not evaluated at run-time, so unlike other cases, here there is no null-pointer dereference happening.
It is analogous to something like
stoken_t * ptr;
sizeof(ptr->val);
In detail:
(stoken_t*)(0)
simply casts 0
(this could be an arbitrary numeric literal) to a pointer to stoken_t
, ((stoken_t*)(0)->val)
is then the type of the val
member of stoken_t
and sizeof
returns the number of bytes this type occupies in memory. In short, this expression finds the size of a struct member at compile time without the need for an instance of that struct type.
© 2022 - 2024 — McMap. All rights reserved.
sizeof( (stoken_t){0}.val )
. Does the very same thing. – Aretino