C - 静态结构无法正常工作



我目前正在使用如下所示的静态结构:

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 放入漫游车大小,它也会出现故障。

有什么想法吗?

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

Rover 被声明为指针并分配给 NULL。 这意味着它什么都不指向。 因此,当您尝试用 Rover>大小取消引用它时,您实际上是在尝试这样做(NULL).size。 你不能这样做,因此分段错误。

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

chunk_t newChunk;
Rover = newChunk;

不幸的是,通过这种方式,newChunk 是在 Mem_alloc(( 中本地声明的,一旦你离开该方法,就告别 newChunk。 如果您希望实例在离开方法范围后持续存在,则需要使用 new

Rover = new chunk_t();  

但是不要忘记在完成 Rover 时拨打 delete,否则会出现内存泄漏。

或者如注释中所述,请确保在取消引用 Rover 之前将其指向非 NULL First。

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

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

static chunk_t * Rover = NULL;

并取消引用 NULL 指针

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

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

相关内容

  • 没有找到相关文章

最新更新