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.
|
TechCake
|
|
| 8May2008,18:54 | #2 |
|
(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) |
|
TechCake
|
|
| 8May2008,19:33 | #3 |
|
You can see this also...
struct Data *ptr = 0; printf("%d\n",&(ptr->b)); |
|
Go4Expert Member
|
|
| 9May2008,10:03 | #4 |
|
Here my doubt is, if ptr value is 0 which is NULL, why access to b using ptr (ptr->b) is not crashing
. Thanks. |
|
TechCake
|
|
| 9May2008,10:18 | #5 |
|
Quote:
Originally Posted by mr.anandc That is Now your Intelligent question!!! Code:
#include<stdio.h>
#include<stdlib.h>
#define offsetof(s,m) (size_t)&(((s *)0)->m)
#define Off(i,j) ((i*)0)->j
struct Data
{
int a;
int b;
};
int main()
{
int OffSet=offsetof(Data, b);
printf("%d", OffSet) ;
return 0;
}
In above code , You are only getting the address not accessing.
int main()
{
int Add=Off(Data , b);
printf("%d", Add) ;
return 0;
}
Last edited by shabbir; 9May2008 at 11:29.. Reason: Code block |
|
Go4Expert Member
|
|
| 9May2008,14:04 | #6 |
|
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. |
|
TechCake
|
|
| 9May2008,14:17 | #7 |
|
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? |
|
Go4Expert Member
|
|
| 9May2008,17:49 | #8 |
|
Then how compiler will differentiate between the two statements, so that it accesses only address of a member.
|
|
TechCake
|
|
| 9May2008,18:03 | #9 |
|
there is differencce b/w &i and i.
&i means not accessing i only address of i. compiler knows &i and i difference |

.