入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

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

创建时间:2016-07-12 投稿人: 浏览次数:2459

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

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

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

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))

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像