Struct GDB:在结构中显示不正确的值

Struct GDB:在结构中显示不正确的值,struct,gdb,memory-address,Struct,Gdb,Memory Address,我正在尝试实现malloc函数,看起来gdb从这个结构中给了我一些奇怪的值: struct MemoryBlock { struct MemoryBlock * next; size_t size; signed char is_free; } startBlock; 这就是我用gdb调试它的函数: struct MemoryBlock*创建新块(大小) { 结构内存块*ret_块; //为结构块添加一些空间 size+=

我正在尝试实现
malloc
函数,看起来
gdb
从这个
结构中给了我一些奇怪的值:

struct MemoryBlock {

    struct MemoryBlock * next;
    size_t               size;
    signed char          is_free;
} startBlock;
这就是我用gdb调试它的函数:

struct MemoryBlock*创建新块(大小)
{
结构内存块*ret_块;
//为结构块添加一些空间
size+=sizeof(结构内存块);
翻新砌块=(空隙*)sbrk(尺寸);
//首先测试,如果我们可以分配那么多的ram
如果(返回块==(无效*)-1)
返回NULL;
ret_block->size=size-sizeof(结构内存块);
ret_block->is_free=0;
ret_block->next=NULL;
return ret_block;//这里是断点
}
这就是问题所在(我在断点
return ret_block
):

如果我想查看
ret_块
指针中的值,我会得到以下结果:

(gdb) p (struct MemoryBlock) ret_block
$26 = {next = 0x555555559000, size = 140737488347680, is_free = -53 '\313'}
size
很好,因为如果我把它转换成十进制,我会得到预期的3。(函数中的参数
size
当前为
3

但是我很惊讶
next
是免费的
不是
0
,因为最后三行都应该设置为0

所以我查了一下记忆中的东西:

正如您所看到的,每个值都正确地存储在我的堆中。但是如果我执行
p(struct MemoryBlock)ret_block
,为什么会得到这些值呢

如果你需要完整的代码
#包括
#包括
/* ============
*结构
* ============ */
结构内存块{
结构MemoryBlock*下一步;
大小;
签名字符是自由的;
}启动块;
/* ==============
*功能
* ============== */
结构内存块*创建新块(大小);
void*malloc(大小);
/* ==================
*主程序
* ================== */
int main()
{
字符*缓冲区;
char*b2;
无符号短索引;
//我堆的开始:D
startBlock.is_free=0;
startBlock.size=0;
缓冲区=malloc(3);
b2=malloc(3);
//----错误-----
if(buffer==NULL | | b2==NULL)
返回1;
//----错误-----
//用随机的东西填充缓冲区
for(index=0;indexsize=size-sizeof(struct MemoryBlock);
ret_block->is_free=0;
ret_block->next=NULL;
返回ret_块;
}
void*malloc(大小)
{
结构内存块*ret_块;
结构内存块*prev_块;
上一块=&startBlock;
ret_block=startBlock.next;
//浏览链接列表,看看是否能找到合适的块
while(ret_block!=NULL&(ret_block->sizeis_free))
{
前向块=后向块;
返回块=返回块->下一步;
}
//找不到合适的块=>创建新块
if(ret_block==NULL){
ret_块=创建新块(大小);
if(ret_block==NULL)
返回NULL;
}
上一块->下一块=返回块;
ret_block->is_free=0;
返回ret_块;
}

好的,我的一个朋友告诉我我的问题……演员阵容不对!以下是解决方案:

(gdb) p * ret_block
$57 = {next = 0x0, size = 3, is_free = 0 '\000'}

一颗星星就足以获得所需的输出…

好的,我的一个朋友告诉我我的问题…演员选错了!以下是解决方案:

(gdb) p * ret_block
$57 = {next = 0x0, size = 3, is_free = 0 '\000'}
一颗星星就足以得到想要的输出