c ++ - 类函数内的数组长度

时间:2013-05-17 21:31:04

标签: c++ arrays size dword

我知道有几个主题提出类似的问题,但我找不到解决方案,而且我对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的大小? =(

2 个答案:

答案 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。