2013-10-11 71 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 *所做的事情。