取消对结构的 int 指针地址的引用

Dereferencing int pointer address to structure

本文关键字:地址 引用 指针 int 结构 取消      更新时间:2023-10-16

你如何使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() 获得容器中当前元素的实际数量。

困惑?在这里阅读有关矢量的信息,或者只是谷歌它。