【问题标题】:Initializing memory allocator in C在 C 中初始化内存分配器
【发布时间】:2018-02-18 11:22:08
【问题描述】:

我正在尝试实现一个init_allocator() 函数来初始化内存分配器并使_length 字节的一部分可用。分配器使用_basic_block_size 作为其最小分配单元。该函数返回分配器可用的内存量。如果发生错误,则返回0。

这是我目前所拥有的:

int memAvail;  // amount of memory to be made available to allocator

unsigned int init_allocator(unsigned int _basic_block_size, unsigned int _length){
    if (_basic_block_size < _ length){
        memAvail = _length/_basic_block_size;
        return memAvail;
    }
    else{           
        return 0;
    }   
}

我不知道这是否是正确的实现,但对我来说似乎是正确的。有什么我做错了吗?我应该使用指针吗?任何建议将不胜感激。

【问题讨论】:

  • 您的要求尚不清楚,但大多数内存子分配器的作用远不止于此。例如,您应该调用您的操作系统 API 来管理一大块内存。
  • 我应该实现一个简单的内存分配器。我不确定 OS AP1 是什么意思

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


【解决方案1】:

这是Kernighan and Ritchie 中第 5.4 章中的内存分配器示例

#include<stdio.h>

#define ALLOCSIZE 10000 

static char allocbuf[ALLOCSIZE]; 
static char *allocp=allocbuf; 

/* Return pointer to n characters */
char *alloc(int n)
{
   if(allocbuf+ALLOCSIZE-allocp>=n){
       // It fits 
       allocp+=n;
       return allocp-n;
   }else 
       // Not enough room
       return 0;
}

allocbuf 是存储字符的内存缓冲区,因为这是一个字符分配器。 *alloccp 是指向下一个空闲位置的指针,最初是 allocbuf 的第一个(即第 0 个)元素。 *alloc 返回指向allocbuf 中第一个位置的指针,程序将在该位置存储n 字符。

这可以很容易地转换为其他数据类型,它展示了可能的简单分配器设计原则。明确您的要求,我可以添加内容。

【讨论】:

  • 这显然是一道作业题。显示一些不同的、不相关的代码并不能真正帮助 OP。
  • @Olaf:它并没有那么不同和无关 - 它显示了一个基本的内存分配器,然后可以修改和扩展。 OP 没有很好地解释他的需求——我鼓励他这样做。他还问他是否需要针对该任务的指示,这表明了这一点。我会添加一个简单的用法示例,但我想我会等待反馈。我也可以解决 OPs 问题,但我不确定这是否具有建设性。如果你不同意,我会扩展这个答案。
  • 阅读How to Ask。如果您的问题不符合规则,请在评论中要求澄清。如果什么都没有,请不要回答。我们不是编码服务,也不是调试服务。这样的答案只会鼓励那些找人做作业的懒惰学生提出不好的问题。设计和调试/测试是编程的主要部分!实际上,它们比编写代码花费更多的时间。
  • @Olaf 我同意,感谢您的链接。我只是认为发布这篇文章并引用 K&R 是一个好主意——以试图促进工作和理解:) 从技术上讲,如果 OP 通过它工作,他肯定会回答他的问题并学习一些重要的东西。尽管我很受诱惑,但我绝对不想完全解决问题。下次不会发生了。适合设计和调试。
  • 我并没有要求将我的问题的解决方案交给我,@atru 链接帮助我指出了我应该做的正确方向。尽管我还没有完全弄清楚,但至少现在我知道我完全偏离了轨道。我是 C 编程的新手,我所需要的只是有人让我知道我是否走在正确的轨道上。就这样。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2012-12-04
相关资源
最近更新 更多