我知道有几个线程问类似的问题,但我找不到解决方案,而且我对 C++ 有点陌生。
我想计算 DWORD 数组的长度。所以它只是一个无符号长整型。
DWORD offsets[] = {0x378, 0x14, 0x0};
这是我的函数的标头定义:
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 的大小? =(
这是因为 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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)