0

そのため、メモリ内の特定のポインターにアクセスしようとすると、セグ フォールトが発生します。私はコードを私が必要だと思うすべてのものに刈り込みましたが、何かを忘れた場合はお知らせください.

char memoryPool[100000];
static const int HEADER_NEXT = 4;

char* firstHole;

void initializeManager(void)
{
    *( (void**)(memoryPool + HEADER_NEXT) ) = 0;

    std::cout << "setting header next: " << (char**)(block + HEADER_NEXT) << std::endl;

    firstHole = memoryPool;
}

int freeRemaining(void)
{
    int result = 0;
    char* block = firstHole;

    while( block != 0 )
    {
        result += *( (int*)(block + HEADER_SIZE) );
        std::cout << "running Result: " << result << std::endl;
        std::cout << "header next: " << (char**)(block + HEADER_NEXT) << std::endl;

        block = *( (char**)(block + HEADER_NEXT) ); // seg fault
    }

    return result;
}

端末出力は次のとおりです。

setting header next: 0x107e760e4
Entering freeRemaining
running result: 65536
header next: 0x107e760e4
Segmentation fault: 11
logout

アドレスは同じですが、なぜそのアドレスに格納されている値 (0) にアクセスできるのでしょうか?

4

2 に答える 2

0
*( (void**)(memoryPool + HEADER_NEXT) ) = 0;

このステートメントと freeRemaining() の同様のステートメントは正しくないように見えます。そこで何をしようとしていますか?また、セグメンテーション違反の理由は、おそらく最後の割り当てです。ブロック変数は、memoryPool の範囲内のアドレスを指しているはずですが、私が見たところ、アドレス 0x0000000 から値を割り当てています。

于 2013-08-05T01:09:57.917 に答える