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

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

有什么想法吗?

4

3 回答 3

1

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

于 2013-10-11T02:17:43.457 回答
0

Rover 是指向chunk_t(struct) 的指针。chunk_tRover 可以保存(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);

在您的情况下,您在Mem_alloc()调用之前将 Rover 初始化为 NULL

static chunk_t * Rover = NULL;

并取消引用 NULL 指针

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

您可能必须创建一个 chunk_t 的对象实例并让 Rover 指向它。否则,你必须做一些类似于你正在做的事情First *

于 2013-10-11T02:35:41.210 回答
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 First。

于 2013-10-11T02:28:25.193 回答