[英]C++: Help understanding this line of code
我一直在寻找一种直接通过指针访问vtable的方法,并且遇到了这篇文章: http : //www.codeproject.com/Tips/90875/Displaying-vtable-when-debugging
它工作正常,我可以通过vtable条目调用函数。 但是我在理解这行deo时遇到了麻烦:
void (**vt)() = *(void (***)())ptr;
ptr
是指向对象的指针。 我怎样才能破译这行? vt
如何获得vtable地址?
谢谢。
_vtable在对象中的实际位置取决于编译器。 该代码假定_vtable地址首先存储在对象中(所有现代编译器似乎都这样做)。 而且,每个类只有一个vtable,它存储在一个位置中。 因此,每个实例都有一个指向函数的指针数组的地址。
基本上,您将创建一个名为vt的变量,该变量是指向返回无效且不带参数的函数的指针的数组。 然后,使用在对象的第一个成员(vtable的地址)中找到的内容初始化此变量。
(void (***)())ptr
表示您将这第一个4(32位计算机)或8(64位计算机)强制转换为指向返回无效且不带参数的函数指针数组的指针。
*(void (***)())ptr
返回这4或8个字节的内容,即vtable的地址。
void (**vt)()
vt是指向某个函数的指针。 该函数返回void并且不接受任何参数。
void (***)()
表示一个指向指向该函数的指针的指针(即比上面的指针高一个指针)。
首先,您将ptr转换为功能的三级指针。
然后,得到它指向的东西(带有单个*
),即指向函数的两级指针。 相同类型的变量vt。 这意味着您可以将其分配给vt,这恰好是这行的功能。
又为什么呢?
指向void-no-param-function的单个函数指针可以存储在这样的变量x: void(*x)()
。 并非完全相关,如果您要将某个数组传递给函数,则需要传递一个指针。 就是 只要将数组地址存储在指针中就可以访问整个数组(如果长度已知)就足够了。
这意味着void(**vt)()
可以存储函数指针数组(的地址)。
vtable只是函数指针的数组。
如果您有一个Car类,其中包含一些变量,例如color和vtable,则它使用例如。 每个对象200个字节。 指向汽车的指针就像指向200字节数组的指针,如果您访问代码中的颜色,则编译器将查找该颜色为例如。 字节133并对其进行访问。
vtable在此对象内的位置是实现定义的,但通常是在开始时定义的。 如果您有指向汽车的指针,则它是指向200个字节的数组的指针,该指针首先分成一些功能指针,然后又分成一些其他数据...
=> vtable,即 一个函数指针数组,从汽车的起始地址开始。
=>如果将汽车指针转换为指向vtable的指针,即 指向“函数指针数组”的指针,即 指向“指向函数的指针”的指针,并尊重您拥有vtable数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.