今天朋友面试,有一个问题他没回答上来,我便在这里给出答案,希望能帮助到一些准备找工作的同学。
面试官会问道:已经知道结构体对象中的一个对象,如何获取结构体的地址呢?
因为结构体成员在内存中的存储数据是按照成员定义顺序存储的,因此,要回答这个问题,首先得解决两个问题
1):该结构体成员的地址
2):该结构体成员在结构体中的偏移地址
意识到这两个问题,还得注意两个细节:
1):C/C++语言中,对指针进行算数运算时指针跳过的内存是:sizeof(*ptr)*n ,其中n是算数运算时参与的值,ptr是指向变量的指针
2):可以通过 #define ptr &(((stud*) 0)->score) 来获取结构体成员的偏移地址(原理比较简单,但这是个很有用的技巧,一定要记住啊)该偏移地址以字节为单位,并不是该成员在结构体中的顺序。因此需要将指针转化为void*类型进行运算奥
有了以上几点基础知识,就可以变成实现了:
#include <stdio.h>
#include <stdlib.h>typedef struct student{
int age;
int weight;
double score;
int height;
}stud;
stud stu={24,70,175,95};
#define ptr &(((stud*) 0)->score)
int main()
{
void * mem_ptr =&(stu.score);
stud * stru_ptr = mem_ptr - (void *)ptr ;
printf("stru_ptr->weight: %d ",stru_ptr->weight );
return 0;
}
通过获取的结构体指针来引用结构体成员,结果为初始化时的值,说明该方法正确;
另外,还可以根据以下方式获取结构体中成员占内存大小:
#define mem_size sizeof((((stud*) 0)->age))