您的位置:首页 > 其它

从结构体成员获取结构体地址的方法

2016-07-12 16:50 330 查看
今天朋友面试,有一个问题他没回答上来,我便在这里给出答案,希望能帮助到一些准备找工作的同学。

面试官会问道:已经知道结构体对象中的一个对象,如何获取结构体的地址呢?

因为结构体成员在内存中的存储数据是按照成员定义顺序存储的,因此,要回答这个问题,首先得解决两个问题

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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: