正在尝试访问指针位置中的值,并获取seg错误
Attempting to access a value in a pointer location and getting a seg fault
因此,当我试图访问内存中的特定指针时,会出现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
相关文章:
- 在 Eclipse: "error: no match for 'operator='" 中获取错误消息
- 函数从指针 c++ 中获取错误的值并返回错误的答案
- 使用 C++ iOS::ate 获取错误的文件大小
- 从谷歌日历API获取错误请求
- 获取错误:之前在此处声明的布尔队列的编辑<T>
- 由于树类中的模板,正在获取错误
- 失败时如何获取错误原因curl_easy_init
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 使用 WindowSetup 类变量获取错误
- 通过查找一对项目的代码获取错误的输出,在给定的总和相等的给定列表中列表
- 带有边界获取错误的 HTTP POST
- 尝试重新连接到服务器时获取错误提升 asio 连接超时
- 使用 C/C++ 获取错误消息MSB6006错误代码 2
- 在此程序中获取错误:检查两个数组是否相等
- 获取错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换
- (C++)在按位 OR 操作时获取错误"Illegal instruction (core dumped)"
- 获取错误mf_e_streamsinks_fixed用于EVR -Windows Media Foundation
- urlmkgetSessionOption获取错误的用户
- Visual Studio C 2K15-在指针地址上获取错误
- 获取错误makefile:45:条件中的语法无效.停止