问题描述:

  1. struct A {
  2. int m_int;
  3. float m_float;
  4. };
  5.  
  6. int main(void) {
  7. printf("%p",&(((struct A*)NULL)->m_float));
  8. return EXIT_SUCCESS;
  9. }

  上述程序会崩溃吗???

分析:

上述程序不会崩溃。原因如下:

假设type是某个结构或者类,member是type中可访问的成员。

  type *p;

  p->member的地址=指针p的地址值+member在type中的偏移量   (1)

将&(((struct A*)NULL)->m_float)代入公式(1)得

  &(((struct A*)NULL)->m_float)=0+4=4,所以最终会输出:0x4。

因此,可以定义如下的宏,用于不产生对象的情况下取得成员变量的偏移量。

  1. #define offsetof(s,m) (size_t)&(((s *)0)->m)

在VC下的stddef.h中有offsetof的官方定义。  

&(((struct A*)NULL)->m_float)---offsetof的更多相关文章

  1. nil、Nil、NULL、NSNull的区别

    nil:指向一个对象的空指针,对objective c id 对象赋空值. Nil:指向一个类的空指针,表示对类进行赋空值. NULL:指向其他类型(如:基本类型.C类型)的空指针, 用于对非对象指针 ...

  2. Objective-C数据类型之id,SEL,BOOL,nil,NULL和NSNull

     id id是指向Objective-C对象的指针,等价于C语言中的void*,可以映射任何对象指针指向他,或者映射它指向其他的对象.常见的id类型就是类的delegate属性. SEL SEL类型是 ...

  3. C语言typeof详解 offsetof

    http://blog.chinaunix.net/uid-28458801-id-4200573.html 前言:    typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常 ...

  4. C++ offsetof

    这是一个宏,用于计算类中某个成员的地址相对于类实例的偏移量 在C++11中,要求这个类standard_layout 基本用法是这样子的: #include <stdio.h> /* pr ...

  5. 通过 struct 成员地址 获取 struct 结构体地址

    1. 问题描述: 现在定义了一个结构体: struct Foo { int a; int b; }; Foo foo; 假如由于函数传参等原因,现在程序只能拿到 foo.b 的地址,这时想通过某种方法 ...

  6. struct timespec 和 struct timeval

    time()提供了秒级的精确度 . 1.头文件 <time.h> 2.函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在 ...

  7. nil、Nil、NULL与NSNull的区别--备用

    我们来分别介绍一下这四种类型: 一.nil 我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉: 或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统 ...

  8. offsetof使用小结

    先上例子 #include <stdio.h> #include <stdlib.h> /* offsetof example */ #include <stddef.h ...

  9. nil、Nil、NULL与NSNull的区别及应用

      总结 nil:OC中的对象的空指针 Nil:OC中类的空指针 NULL:C类型的空指针 NSNull:数值类的空对象 详细解析应用如下: 1.nil 指向一个对象的指针为空 在objc.h中的定义 ...

随机推荐

  1. Linux mysql主从同步配置

    一.在两台Ubuntu机器上安装mysql1.检查系统中是否安装了mysql 这个是已经安装了的 没有安装的话执行上条命令===============================MySQL的一些 ...

  2. myeclipse 10 j安装了JDK1.7,java编译器无法选择到1.7的问题

    java程序编写,在eclipse中会自动编译,编译的版本在preferrence-->java-->compiler选择具体版本,这时你写程序时自动编译用的jdk就是这个版本的jdk,这 ...

  3. java定时任务Quartz Demo(2.X)

    直接上代码 public class HelloQuartz implements Job{ @Override public void execute(JobExecutionContext Jec ...

  4. PAT1022. Digital Library (30)

    两个坑. 一个是一直用的malloc不行了.因为malloc分配的是固定大小,之前做的题没遇到过是因为一般string都不长(malloc分配string为24个Byte),这次直接报段错误,呢们了半 ...

  5. mini6410基于linux2.6.36内核通过NFS启动根文件系统总结(四制作根文件系统及通过NFS挂载文件系统)

    http://blog.csdn.net/yinjiabin/article/details/7489563 根文件系统一般包括: 1)基本的文件系统结构,包含一些必须的目录,比如:/dev,/pro ...

  6. pandas 读取excel的指定列

    不管对于read_csv还是read_excel,现在都有: usecols : int or list, default None If None then parse all columns, I ...

  7. phalcon 连接多个数据库 phalcon multi-database

    db: //This service returns a MySQL database $di->set('dbMaster', function() { return new \Phalcon ...

  8. 奔跑吧,OpenStack现场分享:超融合架构如何抹平物理硬件差异?

    转自:https://www.ustack.com/blog/moping/ “通过引入OpenStack这一中间层,实现了云平台统一的管理调度支配向上交付,解决了业务的灵活性问题.但是在抹平下层物理 ...

  9. PromiseJs

    (function() { var define, requireModule, require, requirejs; (function() { var registry = {}, seen = ...

  10. linux shell 学习笔记--变量声明与赋值,循环

    Bash 变量是不分类型的 ------------------------ 不像其他程序语言一样,Bash 并不对变量区分"类型".本质上,Bash 变量都是字符串. 但是依赖于 ...