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

ご覧のとおり、ローバー サイズに何かを入れようとしています。上記の行は、最初のサイズにゼロを設定します。しかし、ローバーのサイズがその小さな方程式に等しいと想定されると、セグメンテーション違反が発生します。最初のサイズに入れると正しく機能するため、方程式ではないことはわかっています。rover size に 0 を入れようとしても、seg fault になります。

何かご意見は?

4

3 に答える 3

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ただし、使い終わったら on Roverを呼び出すことを忘れないでください。そうしないと、メモリ リークが発生します。

または、コメントで述べたように、Rover を逆参照する前に、NULL 以外の First を指すようにしてください。

于 2013-10-11T02:28:25.193 に答える