求解C++中reinterpret_cast转换后的void指针指向内容
问题解答
你的代码里,reinterpret_cast<void*>(&myStructPtr->myVec)得到的指针,指向的是myVec这个std::vector<int>对象本身的内存地址,而非vector管理的底层元素数组。
具体分析:
myVec.data()返回的是vector底层存储int元素的数组首地址,也就是你push进去的第一个元素1所在的内存位置。&myStructPtr->myVec是取myVec这个vector实例自身的地址——vector对象内部会保存管理底层数组所需的元数据,比如:- 指向底层数组的指针(也就是
data()返回的地址) - 当前已存储的元素数量(对应
size()的返回值) - 容器的容量(对应
capacity()的返回值)
这些元数据占用的内存空间,就是你看到的两个输出地址之间的32字节差值。在64位系统中,指针类型占8字节,多数vector实现会用3个指针存储上述元数据,再加上内存对齐需求,最终vector对象的大小通常是24或32字节,和地址差完全对应。
- 指向底层数组的指针(也就是
你可以在代码里加一行验证vector对象的大小:
std::cout << sizeof(myStructPtr->myVec) << std::endl;
运行后会输出这个vector实例占用的字节数,结果应该和两个地址的差值一致。
reinterpret_cast<void*>只是把vector对象的地址转换成无类型指针,并没有改变它指向的目标——它依然指向vector对象本身,而非底层数组。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

