取消对结构的 int 指针地址的引用
Dereferencing int pointer address to structure
你如何使ai
具有mptr
所指向的结构的实际大小?在这种情况下ai
返回Object
指针的大小为 4 个字节。我正在尝试通过mptr
获取Object
的实际结构尺寸
#include <iostream>
using namespace std;
struct Object {
int t;
int g;
float gBuffer;
};
int CreateObject() {
Object* obj = new Object;
return (unsigned int)obj;
}
int main() {
unsigned int mptr = CreateObject();
size_t ai = sizeof((Object*)mptr);
cout << "Hello World" << endl;
return 0;
}
你可以"使用对象本身"来获取大小(请注意,这一切都发生在编译时,所以编译器基本上会为你查找类型(。
Object* obj;
size_t size = sizeof(*obj);
或者直接使用该类型:
size_t size = sizeof(Object);
第一种方法的优点是,您可以更改obj
的类型,而无需通过整个代码库搜索对该变量执行的每个sizeof
。
完整代码,删除强制转换为int
:
#include <iostream>
using namespace std;
struct Object{
int t;
int g;
float gBuffer;
};
Object* CreateObject(){
return new Object;
}
int main(){
Object* mptr = CreateObject();
size_t ai = sizeof(*mptr); // or sizeof(Object)
cout << "Hello World" << endl;
return 0;
}
更新:
一旦您尝试获取C++标准库容器的大小,它就会变得有点复杂。
像这样考虑这些容器:
struct container {
size_t dataLength;
char* ptrToData;
};
如您所知,指向对象的指针的大小不等于对象本身的大小。
sizeof(char*) -> 4 (32bit) or 8 (64bit) bytes
sizeof(char) -> 1 byte
同样,容器的大小与其管理的数据的大小不同。从上面c
容器的实例可以指向一个 1024 字节大的 char
数组,但sizeof(c)
仍将返回 8(在 32 位系统上(。
// Note that this is not 100% correct because of the padding
// the compiler could add to the struct, but this is out of the
// scope of this answer.
container c;
sizeof(c); // resolves to
sizeof(size_t) + sizeof(char*); // resolves to
4 + 4; // 32bit
ptrToData
指向的数据的大小将存储在 dataLength
中,因此我们可以通过简单地查看容器来获得大小。
请注意,这与 sizeof(( 完全不同
sizeof()
返回编译时已知的对象的大小。C++标准库容器正在管理动态内存,这意味着编译器(因此sizeof()
(无法知道您将在运行时通过容器分配多少内存。
大多数时候,没有理由知道容器本身的大小(实际上,如果您认为需要知道它,则可能做错了什么(。
例如,您真正需要了解的是它当前拥有的元素数量,例如std::vector
。对于std::vector
,您将通过调用 std::vector<>::capacity()
方法获取容器已为其分配内存的元素数,并通过调用 std::vector<>::size()
获得容器中当前元素的实际数量。
困惑?在这里阅读有关矢量的信息,或者只是谷歌它。
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 右值引用转换后的地址更改
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 获取通用/前向引用地址有什么意义?
- 按引用传递和按地址传递之间的差异
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- 常量引用函数参数的地址何时唯一?
- 通过引用传递是否涉及复制地址
- 总是引用的地址等于源地址
- 在函数中传递变量的指针和引用/地址
- 为什么取消引用的指针指向指针的 std::cout 会导致 -fsanitize=地址投诉?
- 如何通过引用获取引用变量的地址?
- 取消引用地址时是否可以重定向到其他地址?
- 在 C++ 03 中,如何引用一个被煽动的模板函数的地址
- 取消引用的输入迭代器的地址?istream_iterator的情况
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- 变量循环范围会导致返回局部变量的地址引用
- 使用cout,如何将char转换为变量的地址/引用(?)
- 为什么函数不能更改其参数对象的地址/引用值?