2

私はこのコードを持っています

unsigned char* MemoryPool::GetNext(unsigned char* pBlock)
{
unsigned char** ppChunkHeader = (unsigned char**)pBlock;
return ppChunkHeader[0];
}

ここから取得http://gamecode4.googlecode.com/svn/trunk/Source/GCC4/Memory/MemoryPool.cpp

unsigned char* から unsigned char** へのキャストが何をするのかわかりません。これらのコード行を追加すると:

unsigned char* MemoryPool::GetNext(unsigned char* pBlock)
{
    unsigned char **ppChunkHeader = (unsigned char**)pBlock;

    printf("ppChunkHeader %p\n", ppChunkHeader);
    printf("pBlock %p\n", pBlock);

    printf("sizeof(unsigned char*) = %i\n", sizeof(unsigned char*));

    printf("ppChunkHeader[0] %p\n", ppChunkHeader[0]);
    printf("&pBlock[0] %p\n", &pBlock[0]);

    printf("ppChunkHeader[0] - &pBlock[0] = %p\n", (ppChunkHeader[0] - &pBlock[0]));

    return ppChunkHeader[0];
}

出力は

ppChunkHeader 00DCB498
pBlock 00DCB498
sizeof(unsigned char*) = 4
ppChunkHeader[0] 00DCB4A1
&pBlock[0] 00DCB4A1
ppChunkHeader[0] - &pBlock[0] = 00000009

私のコードでは、pBlock が 9 つの要素の配列を指していることに言及することが重要だと思います。

ありがとうございました。

4

1 に答える 1

2

キャストはコードの次の行を見ないと理解できない

unsigned char** ppChunkHeader = (unsigned char**)pBlock;
return ppChunkHeader[0];

pBlock はメモリのブロックです。次の行のキャストと逆参照は、そのブロックの最初の 4 バイトを取得し、それを別のポインターとして扱います。次に、その 2 番目のポインターが関数から返されます。

キャストによってポインターの値が変更されていないことがわかります。ppChunkHeader と pBlock は同じ値です。異なるのは、それらが指しているものがどのように解釈されるかです。あなたが書いた場合

return pBlock[0];

pBlock は unsigned char* であるため、これは単一の char になります。ただし、ppChunkHeader は unsigned char** であるため、ppChunkHeader[0] は unsigned char* です。

于 2013-04-18T20:54:13.453 に答える