2013-10-11 3 views
0

настоящее время я использую статическую структуру, которая выглядит следующим образом:статическая структура не работает правильно

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

Как вы можете видеть, им пытаются положить что-то в размере ровера , Строка выше ставит нуль в первый размер. Но когда размер ровера должен равняться этому маленькому уравнению, он segfaults. Я знаю его не уравнение, потому что, когда я помещаю его в первый размер, он работает правильно. Даже если я попытаюсь положить 0 в размер ровера, то это произойдет.

Любые мысли?

ответ

1

Конечно, он падает там, при первом вызове Mem_alloc переменная Rover по-прежнему указывает на NULL в этот момент.

+0

Я не уверен, что понимаю, что вы имеете в виду. – user081608

+0

О, если я поставлю его ниже Rover-> prev и следующей строки, которую вы говорите? – user081608

+1

@ user081608 Положите эту строку после того, как вы * присвойте * 'Rover' (т. Е. Строку' Rover = First-> next; '). –

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, когда вы сделали с ним, или вы будете иметь утечку памяти.

Или, как указано в комментариях, убедитесь, что вы указываете Rover на не-NULL. Прежде чем разыгрывать его.

0

Rover является указателем на chunk_t (struct). Rover может содержать адрес экземпляра chunk_t (struct). Затем вы можете использовать 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); 

В вашем случае, вы инициализацией Ровер в NULL перед тем Mem_alloc() называется

static chunk_t * Rover = NULL; 

и разыменования указателя NULL в

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

Вы можете иметь создать экземпляр объекта chunk_t и сделать Rover точкой. Кроме того, вам нужно сделать что-то похожее на то, что вы делаете для First *.

Смежные вопросы