2012-11-29 70 views
1

我想创建一个空闲列表来实现一个堆分配器。这里是我所定义的结构至今:访问结构成员时出现Segfault

typedef struct headerT headerT; 

struct headerT{ 
    size_t payloadSize; 
    struct headerT* next; // unused field to make struct 8 bytes, simplifies alignment          
}; 

headerT* freeList; 

,这里是我如何初始化我堆:

int myinit() 
{ 
    freeList = InitHeapSegment(0); // InitHeapSegment resets heap segment to empty, no pages             
           //allocated                    
    freeList->payloadSize = 0; 
    freeList->next=NULL; 
    return 0; 
} 

我立即得到一个segfault当函数试图将有效载荷大小更改为零。我在这里错过了什么?

+0

freeList在崩溃时的值是多少? –

+1

请添加InitHeapSegment()的代码。当0通过时它会返回什么?从InitHeapSegment()返回的struct HeaderT是如何分配的? –

回答

0

的问题是在这里:

freeList = InitHeapSegment(0); // InitHeapSegment resets heap segment to empty, no pages             
           //allocated  

你说InitHeapSegment“重置”堆段为空,但没有页面被分配。可能它不是malloc() ing。因此freeList可能指向您没有权限访问的垃圾值,给您一个SIGSEGV或SEGMENTATION VIOLATION错误。在Windows中,此错误类型为Cx00000005