【问题标题】:c++ - length of array inside class function [duplicate]c ++ - 类函数内数组的长度[重复]
【发布时间】:2013-05-17 21:31:04
【问题描述】:

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

【问题讨论】:

  • 如果你有一个固定大小的数组,使用std::array。如果没有,请使用std::vector 之类的容器。除其他事项外,尺寸被安全地包含供您使用。
  • @chris 谢谢你,我还没有找到这个帖子。

标签: c++ arrays size dword


【解决方案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。

【讨论】:

  • 值得注意的是,即使参数为DWORD offsets[3],它仍然会衰减。
  • 确实,重要的是参数的声明,而不是它的当前值。
【解决方案2】:

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

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:: 范围说明符)。

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 2013-03-01
    • 2013-06-23
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多