Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;-类函数内数组的长度 我知道有几个线程问了一个类似的问题,但是我找不到解决方法,我对C++有点新。_C++_Arrays_Size_Dword - Fatal编程技术网

c++;-类函数内数组的长度 我知道有几个线程问了一个类似的问题,但是我找不到解决方法,我对C++有点新。

c++;-类函数内数组的长度 我知道有几个线程问了一个类似的问题,但是我找不到解决方法,我对C++有点新。,c++,arrays,size,dword,C++,Arrays,Size,Dword,我想计算DWORD数组的长度。所以它只是一个未签名的长字符 DWORD offsets[] = {0x378, 0x14, 0x0}; 这是func的标题定义: DWORD allocateAddress(DWORD, DWORD[]); 这在cpp功能中: DWORD Window::allocateAddress(DWORD baseAddress, DWORD offsets[]) { DWORD buffer; DWORD pointer; int leve

我想计算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;
}
如果我在allocateAddress函数中这样做,我只得到4个字节。在main方法中测试它会返回12个字节,这是我想要的值

std::cout << sizeof(Address::offset) << std::endl;

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

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
}
模板
DWORD分配地址(DWORD基地址、DWORD(&偏移量)[计数]){
//现在,sizeof(offset)给出了预期的大小
//作为奖励,您还可以在count中访问元素count
}

通常,模板内联在窗口类定义内部的头文件中(因此我去掉了Window::scope说明符)。

这是因为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。

如果有固定大小的数组,请使用
std::array
。如果没有,请使用类似于
std::vector
的容器。除其他事项外,大小已安全地包含在其中供您使用。@chris谢谢,我还没有找到此线程。值得注意的是,即使参数是
DWORD OFFSET[3]
,它仍然会衰减。事实上,重要的是参数的声明,而不是它的当前值。
DWORD offsets[]