我知道有几个主题提出类似的问题,但我找不到解决方案,而且我对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的大小? =(
答案 0 :(得分: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说明符)。
答案 1 :(得分:1)
这是因为C / C ++不会将数组的长度保存在内存中的任何位置。
“offsets”参数声明为未定义长度的数组。这当然是正确的,因为你想支持任何数组,但这意味着在运行时无法知道数组的大小。
可以这样想:“sizeof”关键字返回基于变量ONLY 的声明的结果,而不是运行时的实际大小。
如果你的变量以这种方式被删除:
DWORD offsets[3]
然后它的类型是“3个DWORD数组”(DWORD[3]
),因此sizeof将返回“3个DWORD数组”或12个字节的字节大小。在您的情况下,数组的大小隐式定义为DWORD[3]
,因为您使用三个值初始化它。
但是如果你将参数声明为:
DWORD offsets[]
它的类型变成“未知长度的数组”(或DWORD[]
)。由于这与常量指针的功能完全相同,因此“sizeof”将表现为好像有一个元素。所以“sizeof”返回1 * sizeof(DWORD)= 4。