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

标签 c++ arrays size dword

<分区>

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

关于c++ - 类函数中数组的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618221/

相关文章:

c++ - C/C++ Bug gdb atof(argv[1]) 需要更改为 idb 才能工作

c++ - 为什么标准区分直接列表初始化和复制列表初始化?

Javascript 从关联数组中查找最小数字(冒泡排序方法)

java - 如何从 MIB 获取 DisplayString 大小约束?

html - 如果屏幕尺寸小于 480px (iPhone 4),如何隐藏图像?

c++ - 删除标准列表中的指针对象

C++:查找数组中的第二个最大元素

php - 从数组中删除重复的 strlen 项?

c++ - 使用两个并行数组 C++

java - 使用方法更改现有数组的大小