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

我认为这是问题所在:

while( block != 0 )

它应该是

while( *block != 0 )

block 是一个指向 memoryPool 的指针,它的值不应该变成 NULL,但它的内容应该是(因为你在初始化期间将下一个标头设置为 0)

编辑:

块指针更新错误

block = *( (char**)(block + HEADER_NEXT) );
block = *( (char**)(CHAR_PTR + HEADER_NEXT) );
block = *( (char**)(CHAR_PTR) );

您正在将 char 指针重新转换为 char 指针的指针。它应该是

block = (char*)(block + HEADER_NEXT);
block = block + HEADER_NEXT // without cast is even better
block += HEADER_NEXT // This one is good too
于 2013-08-05T00:53:56.803 回答
0
*( (void**)(memoryPool + HEADER_NEXT) ) = 0;

此语句和 freeRemaining() 中的类似语句看起来不正确。你想在那里做什么?此外,您的段错误的原因可能是最后一次分配。块变量应该指向 memoryPool 范围内的某个地址,但据我所知,您正在从地址 0x0000000 分配一个值。

于 2013-08-05T01:09:57.917 回答