繁体   English   中英

C ++:帮助理解这一行代码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM