0

同様の質問をしているスレッドがいくつかあることは知っていますが、解決策を見つけることができず、C ++に少し慣れていません。

DWORD 配列の長さを計算したい。したがって、これは単なる unsigned long です。

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バイトしか取得できません。メイン メソッドでテストすると、必要な値である 12 バイトが返されます。

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

1 次元の DWORD のサイズを取得しているのはなぜですか? =(

4

2 に答える 2

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:: スコープ指定子を削除しました)。

于 2013-05-17T21:49:38.957 に答える
1

これは、C/C++ がメモリ内のどこにも配列の長さを保存しないためです。

「offsets」パラメーターは、未定義の長さの配列として宣言されています。任意の配列をサポートしたいので、これはもちろん正しいですが、実行時に配列のサイズを知る方法がないことを意味します。

次のように考えてください。「sizeof」キーワードは、実行時の実際のサイズではなく、変数の宣言のみに基づいて結果を返します。

変数が次のように宣言されている場合:

DWORD offsets[3]

その場合、その型は「3 DWORD の配列」( DWORD[3]) であるため、sizeof は「3 DWORD の配列」または 12 バイトのバイト単位のサイズを返します。あなたの場合、配列のサイズは、DWORD[3]3 つの値で初期化するため、暗黙的に定義されます。

ただし、パラメータを次のように宣言すると:

DWORD offsets[]

その型は「長さ不明の配列」 (またはDWORD[]) になります。これは定数ポインタと機能的に同一であるため、"sizeof" は 1 つの要素があるかのように動作します。したがって、「sizeof」は 1 * sizeof(DWORD) = 4 を返します。

于 2013-05-17T21:52:38.627 に答える