現在、次のような静的構造体を使用しています。
typedef struct chunk_tag {
struct chunk_tag *next;
struct chunk_tag *prev;
int size;
} chunk_t;
chunk_t *morecore(int new_bytes);
サイズ、次と前があります。
このすぐ下に次の行があります。
static chunk_t * First = NULL;
static chunk_t * Rover = NULL;
次に、次のような関数に入ります。
void *Mem_alloc(int nbytes)
{
chunk_t *p = NULL;
//chunk_t *q = NULL;
chunk_t *best;
int blocks;
blocks = nbytes/sizeof(chunk_t);
if(nbytes % sizeof(chunk_t) != 0)
{
blocks++;
}
if(First == NULL)//means new page
{
First = morecore(PAGESIZE);
if(First == NULL)
{
return p;
}
First->size = 0;
Rover->size = PAGESIZE / sizeof(chunk_t)-1; //this line segfaults
First->prev = (First + 1);
First->next = (First + 1);
Rover = First->next;
Rover->prev = First;
Rover->next = First;
requests++;
}
ご覧のとおり、ローバー サイズに何かを入れようとしています。上記の行は、最初のサイズにゼロを設定します。しかし、ローバーのサイズがその小さな方程式に等しいと想定されると、セグメンテーション違反が発生します。最初のサイズに入れると正しく機能するため、方程式ではないことはわかっています。rover size に 0 を入れようとしても、seg fault になります。
何かご意見は?