![]() |
Offset of a data member
Hi,
The below macro is defined in stddef.h standard header file. #define offsetof(s,m) (size_t)&(((s *)0)->m) This gives offset of member data 'm' in structure 's' Ex: struct example { int a; int b; }; printf("%d", offsetof(example, b) ) displays 4 (In win32). Can any one explain how offsetof macro is working? Thanks. |
Re: Offset of a data member
(size_t)&(((s *)0)->m)
(s*)(0) = 0 is integer which is cast to s pointer ((s*)(0))->m = Data member access &(((s*)(0))->m) = Address of data member m (size_t)&(((s*)(0))->m) = cast to standard integer(unsigned) |
Re: Offset of a data member
You can see this also...
struct Data *ptr = 0; printf("%d\n",&(ptr->b)); |
Re: Offset of a data member
Here my doubt is, if ptr value is 0 which is NULL, why access to b using ptr (ptr->b) is not crashing :confused: .
Thanks. |
Re: Offset of a data member
Quote:
That is Now your Intelligent question!!! Code:
#include<stdio.h> |
Re: Offset of a data member
Not yet cleared.
Here how it is able differentiate between accessing address and accessing a member. Suppose in below statement #define offsetof(s,m) (size_t)&(((s *)0)->m) It is accessing address only. But before address operator, it is accessing member using ((s *)0)->m. How this is different from ((i*)0)->j. |
Re: Offset of a data member
There is no difference b/w ((s *)0)->m and ((i*)0)->j .
But when you write statement (size_t)&(((s *)0)->m) Then It will not go for accessing the member data. It's not like intermediate step ((s *)0)->m. just address . If you have doubt then tell me? |
Re: Offset of a data member
Then how compiler will differentiate between the two statements, so that it accesses only address of a member.
|
Re: Offset of a data member
there is differencce b/w &i and i.
&i means not accessing i only address of i. compiler knows &i and i difference |
| All times are GMT +5.5. The time now is 05:59. |