从结构体成员获取结构体地址的方法
来源:互联网 发布:莎拉 巴雷斯坦 知乎 编辑:程序博客网 时间:2024/06/06 07:08
今天朋友面试,有一个问题他没回答上来,我便在这里给出答案,希望能帮助到一些准备找工作的同学。
面试官会问道:已经知道结构体对象中的一个对象,如何获取结构体的地址呢?
因为结构体成员在内存中的存储数据是按照成员定义顺序存储的,因此,要回答这个问题,首先得解决两个问题
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))
0 0
- 从结构体成员获取结构体地址的方法
- 从一个成员得到结构体的地址
- 如何获取结构体某成员的偏移地址
- 如何获取结构体某成员的偏移地址
- 如何获取结构体某成员的偏移地址
- 通过结构体成员的地址获取结构体变量的地址
- 通过结构体成员的地址获取结构体变量的地址
- C语言--通过结构体成员的地址获取结构体变量的地址
- 如何通过结构体成员的地址获取结构体变量的地址?
- 计算结构体成员偏移地址的一种方法
- 通过成员变量地址获取结构体地址
- 通过成员变量地址获取结构体地址
- 结构体成员地址在结构体内的偏移
- 结构体成员偏移地址
- c语言结构体及成员的互换,并且打印结构体地址和成员地址
- 结构体的地址与数据成员的地址
- 使用宏定义来获取一个结构体成员相对于该结构体首地址的偏移量
- 一种 获得结构体成员的方法
- 解压文件夹
- Yii render
- Suricata.yaml
- iOS开发之图片旋转
- <limits.h> - C语言标准库
- 从结构体成员获取结构体地址的方法
- Freemaker初接触(三)基本类型和list和map的遍历
- JAVA程序单实例运行的实现方法
- socket连接设置超时的几种方法
- 附加数据库
- rancheros学习记录--从安装开始
- 08_MinNumberInRotatedArray旋转数组的最小数字
- 打开一个新的activity并关闭当前activity,以及intent的用法
- css实现鼠标移动图片上放大效果