正在尝试访问指针位置中的值,并获取seg错误

Attempting to access a value in a pointer location and getting a seg fault

本文关键字:获取 错误 seg 访问 位置 指针      更新时间:2023-10-16

因此,当我试图访问内存中的特定指针时,会出现seg错误。我已经将代码修剪到我认为需要的程度,但如果我忘记了什么,请告诉我。

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)?

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

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

我认为这就是问题所在:

while( block != 0 )

应该是

while( *block != 0 )

块是指向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