【问题标题】:memory allocator - issue while traversing the memory内存分配器 - 遍历内存时的问题
【发布时间】:2016-09-18 01:07:42
【问题描述】:

我已经编写了简单的内存分配器,但遇到了问题,我认为我没有像我想的那样访问内存元素 :) 并且我无法找出错误。从输出端又出现了两个问题,还有更多我不会意识到的问题。

问题 - 1) while(block->next != NULL) 在到达下一个块时崩溃 2) 在 free mempr->size 中归零。

我没有尝试研究内存对齐或碎片方面,目标是让一些简单的工作

#include <stdio.h>
#include <stdbool.h>

#define length 10000

char memory[length] = {0};

typedef struct MEMBLOCK
{
  struct MEMBLOCK *next;
  int size;   
  bool is_available;
}memblock;

int remain_memory = length;

memblock* ptrlastblock;
memblock* endOfBlock(memblock *block);
void* allocMemory(memblock *block, int size);
void* xmalloc(size_t size);
void myfree(void *ptr);


int main(void) 
{
  int *ptr = (int *)xmalloc(10);
  if (ptr == NULL)
  {
    printf("memory allocation failed \n");
  }
  else
  {
    *ptr = 4;
  }
 // myfree(ptr);
  int *ptr1 = (int *)xmalloc(10);
  myfree(ptr1);

  return 0;
}

void* xmalloc(size_t size)
{
  memblock *block = (memblock*) memory;  // point to head of memory region
  return allocMemory(block, size);
}

void* allocMemory(memblock *block, int size)
{
  if (remain_memory == length)  // if no memory used allocate block
  {
    block->next = NULL;            
    block->is_available = false;
    block->size = size;
    ptrlastblock = endOfBlock(block); // point it to beginning of next block
    remain_memory -= size;
    return (void *)block + 1;  // increment block so pointing to begining of memory post block
  }

  if(remain_memory > size)
  {
      while(block->next != NULL)  // keep incrementing till you find 
      {                             // last used chunk
       block = block->next;
      }
    block = endOfBlock(block);
    block->next = NULL;
    block->size = size;
    block->is_available = false;
    remain_memory -= size;
    return (void *)block + 1;
  }
  else
  {
    return NULL;
  }

}

memblock* endOfBlock(memblock *block)
{
  memblock* eofblock = (memblock*)((size_t)(block + 1) + (size_t)block->size);
  return eofblock;
}

void myfree(void *ptr)
{
  memblock *memptr = (memblock *)ptr - 1;
  if (memptr->is_available == false)
  {
    memptr->is_available = true;
    printf(" memory with pointer is %d \n", memptr->size);
    remain_memory += memptr->size;
  }
}

标签: c memory memory-management malloc dynamic-memory-allocation


【解决方案1】:

我认为问题在于:

return (void *)block + 1;

被解释为:

((void *) block) + 1

因为施法的优先级高于加法。你可能会用*ptr = 4; 覆盖你的memblock 结构。

[编辑]

我认为你应该做 Eugene 在评论中已经建议的:

return (void *) (block + 1)

【讨论】:

  • 非常感谢您的回答 - 是的,您是对的,我对此一无所知。所以谢谢你让我意识到这一点
猜你喜欢
  • 2011-01-07
  • 2011-03-18
  • 2015-06-10
  • 2011-08-24
  • 2021-05-04
  • 2021-06-30
相关资源
最近更新 更多