Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   Offset of a data member (http://www.go4expert.com/forums/offset-data-t10441/)

mr.anandc 7May2008 16:19

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.

asadullah.ansari 8May2008 18:54

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)

asadullah.ansari 8May2008 19:33

Re: Offset of a data member
 
You can see this also...
struct Data *ptr = 0;

printf("%d\n",&(ptr->b));

mr.anandc 9May2008 10:03

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.

asadullah.ansari 9May2008 10:18

Re: Offset of a data member
 
Quote:

Originally Posted by mr.anandc
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.


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;
}

In this code , now you are accessing so segmentation fault will come.

mr.anandc 9May2008 14:04

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.

asadullah.ansari 9May2008 14:17

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?

mr.anandc 9May2008 17:49

Re: Offset of a data member
 
Then how compiler will differentiate between the two statements, so that it accesses only address of a member.

asadullah.ansari 9May2008 18:03

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 18:00.