我目前正在使用如下所示的静态结构:
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设置为流动站大小,也会出现故障。
有什么想法?
答案 0 :(得分:1)
当然它崩溃了,在第一次调用Mem_alloc
时,变量Rover
仍指向NULL
。
答案 1 :(得分:0)
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。
答案 2 :(得分:0)
Rover是指向chunk_t
(struct)的指针。流动站可以保存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);
在您的情况下,您在调用Mem_alloc()
之前将Rover初始化为NULL
static chunk_t * Rover = NULL;
并取消引用
中的NULL指针Rover->size = PAGESIZE / sizeof(chunk_t)-1; //this line segfaults
您可能必须创建chunk_t的对象实例并使Rover指向该实例。否则,你必须做一些类似于你为First *
所做的事情。