我正在使用C中的内存分配器(从头开始重写 malloc 和 free )。我使用由 mmap 创建的堆,并在每个内存块之前使用标头来获取有关块的信息。我使用以下结构来处理我的空闲列表(所有空闲块的“列表”):
typedef struct node_t {
long int size;
struct node_t *next;
}node_t;
分配新内存块时,我使用临时node_t* temp
。我们还node_t* startfree
指向我的免费列表的头部
变量int size
是包含代码部分的函数的参数
bheader_t
是我们稍后会使用的另一种结构。
node_t* temp = (node_t*) (startfree+size+sizeof(bheader_t));
printf("DEBUG : temp %p\n",temp );
printf("DEBUG : startfree %p, size = %ld, next = %p \n",startfree, startfree-> size, startfree -> next );`
printf("DEBUG : future value of temp->size : %ld\n",startfree -> size - size -sizeof(bheader_t));
printf("DEBUG : We want to do temp(%p)->size = startfree(%p)->size (=%ld) - size (=%d) - sizeof(bheader_t) (=%ld)\n", temp, startfree, startfree->size, size, sizeof(bheader_t));
temp -> size = startfree->size - size -sizeof(bheader_t);
printf("DEBUG : temp %p, size : %ld\n",temp,temp->size );
temp -> next = startfree -> next;
startfree = temp;
在某些情况下它很顺利,但在其他情况下,这是我得到的(在 gdb 中):
DEBUG : temp 0x7ffff7ff0a0c
DEBUG : startfree 0x7ffff7ef094c, size = 996000, next = (nil)
DEBUG : future value of temp->size : 930452
DEBUG : We want to do temp(0x7ffff7ff0a0c)->size = startfree(0x7ffff7ef094c)->size (=996000) - size (=65536) - sizeof(bheader_t) (=12)
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bd7a69 in Mem_Alloc_NF (size=65536) at src/nextfit.c:108
108 `temp -> size = startfree->size - size -sizeof(bheader_t);`
对简单的int
做法进行Segfault!任何想法可能是什么?
答案 0 :(得分:0)
node_t* temp = (node_t*) (startfree+size+sizeof(bheader_t));
几乎肯定是错的。如果startfree
的类型为node_t *
,则会将(size + sizeof(bheader_t)) * sizeof(node_t)
添加到原始指针。我怀疑你真的想要node_t* temp = (node_t*) ((char *)startfree+size+sizeof(bheader_t));
。