(记录)如何取结构体中成员的偏移
来源:互联网 发布:iterator java 编辑:程序博客网 时间:2024/04/29 05:03
在linux一站式编程里看到一段程序。unix域套接字绑定。
#include <stdio.h>#include <stddef.h>#include <sys/socket.h>#include <sys/un.h>int main(void){ int fd, size; struct sockaddr_un un; memset(&un, 0, sizeof(un)); un.sun_family = AF_UNIX; strcpy(un.sun_path, "foo.socket"); if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { perror("socket error"); exit(1); } size = offsetof(struct sockaddr_un, sun_path) + strlen(un.sun_path); //宏,取偏移量 if (bind(fd, (struct sockaddr *) &un, size) < 0) { perror("bind error"); exit(1); } printf("UNIX domain socket bound\n"); exit(0);}offsetof宏,它在stddef.h头文件中定义:
#define offsetof(TYPE, MEMBER) ((int)&((TYPE *)0)->MEMBER)offsetof(struct sockaddr_un, sun_path)就是取sockaddr_un结构体的sun_path成员在结构体中的偏移,也就是从结构体的第几个字节开始是sun_path成员。
ANSI C标准允许任何值为0的常量被强制转换成任何一种类型的指针,并且转换结果是一个NULL指针,因此((TYPE*)0)的结果就是一个类型为TYPE*的NULL指针。如果利用这个NULL指针来访问TYPE的成员当然是非法的,但&(((TYPE*)0)->MEMBER)的意图并非想存取TYPE字段内容,而仅仅是计算当结构体实例的首址为((TYPE*)0)时MEMBER字段的地址。聪明的编译器根本就不生成访问MEMBER的代码,而仅仅是根据TYPE的内存布局和结构体实例首址在编译期计算这个(常量)地址,这样就完全避免了通过NULL指针访问内存的问题
- (记录)如何取结构体中成员的偏移
- 得到结构体中成员的偏移
- 取(结构体)成员偏移量
- 如何计算结构体大小和结构体中成员的内存偏移
- 如何求出结构体的成员变量的偏移量
- 如何求出C语言结构体中各个成员的大小及内存偏移量
- 如何获取结构体某成员的偏移地址
- 如何获取结构体某成员的偏移地址
- 如何获取结构体某成员的偏移地址
- 求结构体中成员的偏移值
- gdb 显示结构体中成员的偏移量
- 通过宏定义取结构本中成员的偏移量
- 结构体中成员变量偏移量
- 求结构体成员的偏移量
- 结构体成员变量的偏移值
- 结构体成员偏移量的计算
- 如何求结构体成员的偏移地址 || 结构体的 sizeof 总结
- 如何取得结构体成员相对于结构体的偏移量
- corba例程
- unix find command tutorial and sample code
- 形象
- 更换wordpress默认语言
- Linux下重要日志文件及查看方式
- (记录)如何取结构体中成员的偏移
- 数据库事务、游标
- Hibernate的HQL总结
- Wince 6.0 教程---第五课.更改任意文件夹路径
- 转:闷声发大财:网上调查公司Qualtrics背后的故事
- 第四课、XIP与HIVE
- 谈在Debug和Release模式下输出调试信息 .
- gis海量资源网盘提供VIP账号无广告高速下载 (更新更多资源)
- Linux常用命令大全