获取C++类成员变量的地址偏移

今天有在校学生问怎么获取类中的成员变量的地址偏移量,这个应该是很多初学C++的人很好奇的问题。以前我在学校的时候,也有过这种需求。忘了当时是要写什么“奇怪的程序”了,反正需要获取一个类的成员变量的地址偏移量。

其实这个问题很简单,如果你了解C++的类对象内存分布的话,这个根本不是问题。我给他举了个例子:

struct A

{

  int i;

};

&((A*)0)->i; // 这样就可以获取到偏移量了。他表示不理解,OK,我们来具体说说。

假如定义个变量A a; 我们都知道 &a表示变量a的首地址,&(a.i)表示变量i的地址,那么&(a.i)减去&a不就得到i的偏移量了吗?

是的,就是这么简单。那么这个例子&((A*)0)->i;有什么关系呢?

&((A*)0)的地地址就是0,所以&((A*)0)->i 等于&((A*)0)->i减去0。

那个学生更好奇了,为什么&((A*)0)->i 不会出问题?这个例子里并没有为A的对象分配内存,那怎么可以得到它的地址呢?

是的,这里确实没有分配内存,但是这个例子里我们并没有要求有内存,我们也不对内存进行操作,所以不会引来崩溃。

&((A*)0)->i只是借助编译器为我们计算出它的地址。当编译器要用要一个成员变量的时候,它会根据对象的首地址加上成员的偏移量得到成员变量的地址。当对象的首地址为0时,得到的成员变量地址就是它的偏移量。

到这里,明白了吧!

时间: 2024-10-13 12:54:42

获取C++类成员变量的地址偏移的相关文章

Objective-C类成员变量深度剖析

目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objective-C类不能动态添加成员变量 总结 看下面的代码,考虑Objective-C里最常见的操作之一——类成员变量访问. - (void)doSomething:(SomeClass *)obj { obj->ivar1 = 42; // 访问obj对象的public成员变量 int n = sel

C++ 定义引用型类成员变量

作者 : 卿笃军 1)早在学习C语言的时候,我们就知道,在定义结构体的时候,不能在结构体中定义该结构体类型的变量: struct node { int a; // struct node b; //错 struct node *next; //对 }; 因为,该结构体还在定义中....不知道结构体里面具体有什么内容,所以无法定义对象b.但是可以定义指针*next. 2)现在,C++里面多出来了一个叫引用的东东(很强大): 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样.

Python的类成员变量默认初始值的坑

问题发现:一个循环内,缺省值初始化同名变量,其中的list成员不是空,会延续之前同名变量的值. 示例代码: # Define class class Variant(): # use def __init__(self, price = 500, description = 'default description', values = ['', '', '']): self.price = price self.description = description self.values = v

C++---类成员变量定义为引用

摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #include <iostream> using namespace std; class A { public: A(int k):a(n){ // 必须要在初始化列表中进行初始化 n = k; cout << a <<endl; } int get() const { r

C语言根据结构体成员变量的地址,得到结构体的地址

看nginx代码时发现双链表使用的是这种方法,记录一下 给出一个实例来说明 struct father_t {    int a;    char *b;    double c;}f;char *ptr = &(f.b);//而不是 ptr = f.b; 这里ptr是b的地址,而不是它指向的地址. 根据C语言对struct类型的存储特性,我们可以画这么一个图示:通过分析图示,我们可以看出,我们只需要把当前知道的成员变量的地址ptr,减去它在结构体当中相对偏移4就的到了结构体的地址(ptr-4)

类成员变量初始化的问题

class window{ window(int maker){ System.out.println("window"+maker); } } class House{ window w1 ;//new window(1); window w3 = new window(3); House(){ System.out.print("House"); w3 = new window(33); } window w4 = new window(4); } class

PHP 类成员变量规范得一些理解。

今儿写代码是发现一个问题: PHP 类 成员变量不能接受方法得返回值 做以下测试: bin_2.php <?php /** * Created by PhpStorm. * User: Administrator * Date: 14-12-4 * Time: 下午9:45 */ header("Content-type:text/html;charset=utf-8"); require_once('bin_1.php'); require_once('bin_3.php');

直接调用类成员函数地址(用汇编取类成员函数的地址,各VS版本还有所不同)

在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法.C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数. // Thunk.cpp : Defines the entry point for the console applicatio

php 类 成员变量 $this-&gt;name=&#39;abc&#39;

<?php class test { public function getName() { $this->name='abc'; echo $this->name; } }$a=new test();$a->getName(); 1.$this->name='abc'对应的BNF范式 expr_without_variable: variable '=' expr { zend_check_writable_variable(&$1); zend_do_assign