在中括号里补充语句,使程序完整
typdedef struct _A{
... ... // some definitions
int x;
... ... // some definitions
int y;
}A
void foo(int *px)
{
//print the value of y
【 】
}
void main()
{
A *a = ( A *) malloc (sizeof(A));
if ( a == NULL )
return ;
foo( &(a->x));
}
此处的问题是如何通过结构体内一个成员变量的地址,找到另一个成员变量的地址。
当时没有思路。
下来看别人讨论才知道怎么回事,
可以再定义一个A b;
那么 &b.y-&b.x即y与x之间的偏移。
printf("%d",*(px+(&b.y-&b.x)));
就可以打印出y的值。
在 C语言中有个offsetof函数
用来计算结构体中成员变量的偏移,
下面一段内容来自 http://www.2.newsmth.net/bbscon.php?bid=332&id=390&ftype=3&num=39
start
5. offsetof
常见的 offset 定义
#define offsetof(s, m) ((unsigned) &((s*)0)->m)
问题1:标准要求 offsetof 的结果是 size_t 类型,unsigned 不一定等同于 size_t
即便改成用 size_t
#define offsetof(s, m) ((size_t) &((s*)0)->m)
在 C++ 中,由于 & 运算符可以被重载,因此这样的 offsetof 得到的结果仍然可能是
错的。
gcc 3 给的答案颇为复杂:
#ifndef __cplusplus
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#else
/* The cast to "char &" below avoids problems with user-defined
"operator &", which can appear in a POD type. */
#define offsetof(TYPE, MEMBER) \
(__offsetof__ (reinterpret_cast <size_t> \
(&reinterpret_cast <const volatile char &> \
(static_cast<TYPE *> (0)->MEMBER))))
没有评论:
发表评论