从结构体成员获取结构体地址的方法
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))
面试官会问道:已经知道结构体对象中的一个对象,如何获取结构体的地址呢?
因为结构体成员在内存中的存储数据是按照成员定义顺序存储的,因此,要回答这个问题,首先得解决两个问题
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))
相关文章推荐
- UFT中怎么处理 “分段截断(null)由于将在索引、主关键字、或关系中创建重复的值,请求对表的改变没有成功。。”...
- 在Java中动态的加载一个布局
- HDU 2063 过山车(二分匹配入门)
- 解决自定义securityMetadataSource不能使用依赖注入的问题,nullpointer问题,空指针问题
- Linux软件安装包中devel与非devel包之间的区别
- WCF学习之旅—基于ServiceDebug的异常处理(十七)
- 【bzoj4027】 [HEOI2015]兔子与樱花
- Sum of Two Integers
- Drools 6.0 Hello World
- Maven详解之仓库------本地仓库、远程仓库、私服
- deep learning---利用caffe在vgg-face上finetuing自己的人脸数据
- 详解资源文件Drawable下面的shape标签
- 合金
- <a>标签跳转和执行js函数,href和onclick属性
- +function ($) { "use strict";}(window.jQuery);全面分析
- 「Unity」UGUI的Text实现首行缩进的办法
- iOS开发之指纹解锁
- jquery $.trim()方法使用介绍
- iOS开发中的Web Service
- FreeSwitch Lua Welcome IVR