0

我知道有几个线程在问类似的问题,但我找不到解决方案,而且我对 c++ 有点陌生。

我想计算一个 DWORD 数组的长度。所以它只是一个无符号长。

DWORD offsets[] = {0x378, 0x14, 0x0};

这是我对 func 的标题定义:

DWORD allocateAddress(DWORD, DWORD[]);

这是在 cpp 函数内部:

DWORD Window::allocateAddress(DWORD baseAddress, DWORD offsets[])
{
    DWORD buffer;
    DWORD pointer;

    int level = 3; // Length of offset array should be calculated here.

    for (int c = 0; c < level; c++)
    {
        if (c == 0)
        {
            buffer = this->read(baseAddress); 
        }

        pointer = buffer + offsets[c];
        buffer = this->read(pointer);
    }

    return pointer;
}

这就是我计算长度的方式:

sizeof(offset) / sizeof(*offset) // or sizeof(offset[0])

如果我在 allocateAddress 函数中这样做,我只会得到 4 个字节。在 main 方法中测试它返回 12 个字节,这是我想要的值。

std::cout << sizeof(Address::offset) << std::endl;

为什么我得到一维 DWORD 的大小?=(

4

2 回答 2

1

模板函数可以传递静态数组的大小:

template <size_t COUNT>
DWORD allocateAddress(DWORD baseAddress, DWORD (&offsets)[COUNT]) {
    // now, sizeof(offsets) gives the expected size
    // as a bonus, you could also access the element count in COUNT
}

通常,模板在 Window 类定义的头文件中内联(所以我去掉了 Window::scope 说明符)。

于 2013-05-17T21:49:38.957 回答
1

这是因为 C/C++ 不会将数组的长度保存在内存中的任何位置。

“offsets”参数被声明为一个未定义长度的数组。这当然是正确的,因为您想支持任何数组,但这意味着在运行时无法知道数组的大小。

可以这样想:“sizeof”关键字仅根据变量的声明返回结果,而不是运行时的实际大小。

如果您的变量以这种方式定义:

DWORD offsets[3]

那么它的类型是一个“3 个 DWORD 的数组”(DWORD[3]),所以 sizeof 将返回一个“3 个 DWORD 的数组”或 12 个字节的大小(以字节为单位)。在您的情况下,数组的大小被隐式定义为,DWORD[3]因为您使用三个值对其进行了初始化。

但是,如果您将参数声明为:

DWORD offsets[]

它的类型变成一个“未知长度的数组”(或DWORD[])。由于这在功能上与常量指针相同,因此“sizeof”将表现得好像只有一个元素。所以“sizeof”返回 1 * sizeof(DWORD) = 4。

于 2013-05-17T21:52:38.627 回答