我正在尝试处理一个让我们在C中创建自己的malloc函数的赋值,但是我遇到了一些这些块的问题。基本上我的代码适用于根据需要添加了块的堆。如果我按顺序添加和占用这些块我没有问题,但是当我在这个堆的中间找到一个块并将其拆分为仅占用所需空间时,我当前遇到了问题。基本上,该块被分割并且第一部分被占用,而第二部分被分配为空闲块。因为每个块都是列表中的双向链,所以它知道它之前和之后的块。出于某种原因,新块在从原始块中拉出值时遇到麻烦。示例输出如下所示:
Allocating: 3000 bytes
Finding a block...
Iter: 0, Block: 19931136, Size: 5000, Usage: 1
Iter: 1, Block: -767770784, Size: 4500, Usage: 1
Iter: 2, Block: -767766240, Size: 4000, Usage: 1
Iter: 3, Block: -767762208, Size: 2920, Usage: 0
Iter: 4, Block: 19947676, Size: 3500, Usage: 1
Iter: 5, Block: -767775280, Size: 16000, Usage: 0
Splitting a block... (b->nb = 0)
********************************************************
Memory allocation policy: first fit
Total number of bytes allocated: 20200
Total free space in bytes: 15880
Largest contiguous free space in bytes: 12960
Total number of heap extensions: 2
********************************************************
Allocating: 2500 bytes
Finding a block...
Iter: 0, Block: 19931136, Size: 5000, Usage: 1
Iter: 1, Block: -767770784, Size: 4500, Usage: 1
Iter: 2, Block: -767766240, Size: 4000, Usage: 1
Iter: 3, Block: -767762208, Size: 2920, Usage: 0
Splitting a block... (b->nb = 19947676)
********************************************************
Memory allocation policy: first fit
Total number of bytes allocated: 22740
Total free space in bytes: 13340
Largest contiguous free space in bytes: 12960
Total number of heap extensions: 2
********************************************************
Allocating: 2000 bytes
Finding a block...
Iter: 0, Block: 19931136, Size: 5000, Usage: 1
Iter: 1, Block: -767770784, Size: 4500, Usage: 1
Iter: 2, Block: -767766240, Size: 4000, Usage: 1
Iter: 3, Block: -767762208, Size: 2500, Usage: 1
Iter: 4, Block: -767759664, Size: 0, Usage: 0
Iter: 5, Block: -1006104535, Size: -2390907, Usage: -84361856
Segmentation fault
我添加了迭代打印,以显示代码在通过链接列表使用第一个匹配策略搜索时所经历的阶段。 "块:"显示内存中该块的给定地址。 b-> nb跟随"分裂块..."显示下一个块的地址的实际值,该地址在拆分之前从原始未拆分块中拉出。如果仔细观察分段错误之前的迭代5,可以看到块地址是" -1006104535"什么时候应该是" 19947676"。
因此,由于某些原因,当我操作列表中间的块时,我的代码无法复制此指针。为了更深入地了解,我提供了block_t结构和拆分块方法,这显然是经过大量调试后问题所在。
typedef struct block_t{
int usage; // Is block free or in use
size_t size; // Size of block
void *previousBlock; // Ptr to last block
void *nextBlock; // Ptr to next block
char data[1]; // Data space of block
} block_t;
...
// Function for splitting block into free and used block
void splitBlock(block_t* block, int size){
block_t* newBlock;
char *str[80];
char buffer[(int)block->size - size];
newBlock = (block_t*) buffer;
sprintf(str, "Splitting a block... (b->nb = %d)", (int*) block- >nextBlock);
puts(str);
// Intialize new block
newBlock->usage = 0;
newBlock->size = block->size - (size_t) size;
newBlock->previousBlock = (void*) block;
newBlock->nextBlock = block->nextBlock;
// Edit old block
block->nextBlock = (void*) newBlock;
totalNumBytesAllocated += size;
totalFreeSpace -= size;
totalNumBlocks++;
return;
} // End splitBlock
我可以帮助我发现问题的任何帮助将不胜感激。我觉得逻辑是合理的,但是对于我正在使用的指针或我正在操作的堆,可能有一些我不理解的东西。应该注意的是,我理解seg错误问题是因为我的搜索是在一个不起眼的位置寻找下一个块,所以我知道这是一个指针问题,一旦它被解决,就不会发生seg错误。 / p>