2013-10-11 47 views
0

我目前使用的是静态结构,看起来像下面这样:静态结构工作不正常

typedef struct chunk_tag { 
struct chunk_tag *next; 
struct chunk_tag *prev; 
int size; 
} chunk_t; 
chunk_t *morecore(int new_bytes); 

它的大小,next和prev。

下这个权利我有台词:

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++; 
} 

正如你可以看到我尝试把东西放到月球车大小。上面的行将零放入第一个尺寸。但是,当漫游车的大小应该等于那个小的等式时,就会发生段错误。我知道它不是这个方程式,因为当我把它放到第一个尺寸时它就能正常工作。即使我尝试将0设置为流动站大小,它也会出现故障。

有什么想法?

回答

1

当然,它在那里崩溃,在第一次调用Mem_alloc时,变量Rover仍指向NULL

+0

林不知道我明白你的意思。 – user081608

+0

哦,如果我把它放在Rover-> prev和next line的下面你说的? – user081608

+1

@ user081608将*行赋予'Rover'(即'Rover = First-> next;'line)之后放置该行。 –

0

Rover被声明为一个指针并被赋值为NULL。这意味着它没有指向任何东西。所以当你试图用Rover-> size解除引用时,你确实试图去做(NULL).size。你不能这样做,因此分段错误。

下面的代码将创建chunk_t的一个实例并将指针Rover分配给它。

chunk_t newChunk; 
Rover = newChunk; 

不幸的是,这种方式newChunk在里面Mem_alloc局部声明(),一旦你离开的方法,告别newChunk。如果希望实例在离开方法范围后持续使用,则需要使用new

Rover = new chunk_t(); 

但不要忘记在罗孚调用delete当你用它做,或者你将有一个内存泄漏。

或者正如评论中提到的那样,确保您在提取它之前将Rover指向非NULL First。

0

流动站是指向chunk_t(结构)的指针。流浪者可以持有chunk_t(结构)实例的地址。然后,您可以使用Rover来获取/设置Rover指向的对象实例的值。

例子:

chunk_t instance_one; 
Rover = &instance_one; 
.... //Assuming instance_one members are initialized. You may then access instance_one members using Rover 
printf("size member of chunk_t: %d",Rover->size); 

在你的情况,你Mem_alloc()之前初始化路虎为NULL被称为

static chunk_t * Rover = NULL; 

和非关联化的

Rover->size = PAGESIZE/sizeof(chunk_t)-1; //this line segfaults 

你可能有NULL指针创建chunk_t的对象实例并使流动站指向该实例。否则,你必须做一些类似于你为First *所做的事情。