定义基本的alloc函数

时间:2018-07-02 06:08:39

标签: c dynamic-memory-allocation

这是K&R书 ch5 中的一个示例,该示例定义了我得到的alloc函数,但是我陷入了困境,无法理解他为什么返回旧指针,并且在第一条语句{{1}中}他先递增allocp,然后递减allocp += n;这是我的第一个问题,同样我也无法理解条件块

allocp - n

当他编写return语句时,如果角色将完成,则返回旧指针,并执行一个循环。并且无法覆盖所有n个细分受众群。 我的第二个问题是否在if块中写返回而不是在if块中写出来是真的吗? 这是整个代码

if(condition is true)
 do something;

2 个答案:

答案 0 :(得分:1)

该函数应该分配内存,并返回指向已分配段的指针,而allocp仅用于跟踪已分配的内存量。

if语句内部返回是可以的,尽管根据经验,应该尽量避免从同一函数返回多个return语句。

您可以将函数重写为类似以下内容:

#include <stdint.h>

#define ALLOCSIZE 1000
static uint8_t allocbuf [ALLOCSIZE];
static size_t alloc_size = 0;

uint8_t* alloc (size_t n)
{
  uint8_t* result = NULL; 

  if(alloc_size + n < ALLOCSIZE)
  {
    result = allocbuf + alloc_size;
    alloc_size += n;
  }

  return result;
}

答案 1 :(得分:0)

您发布的代码段确实有用-

  1. 具有1000个字节的静态缓冲区,表示为

    static uint8_t allocbuf [ALLOCSIZE];
    
  2. 当用户通过alloc()调用“ n”个字节时,它将检查是否有足够的可用内存(该请求适合1000个字节)并返回一个指向此开头的指针。分配请求。 (可以有多个分配请求)。

  3. 第二次调用alloc,您会看到allocp指针如何指向最后一个alloc请求的第(结束地址+第1个)字节? (如果看不到它,建议您阅读static关键字的作用)。因此,如果允许的话,新分配将从allocp开始。否则,它将返回NULL。

如果您对编程非常陌生,如Jabberwocky所建议,请动笔,对多个alloc调用进行数学运算。您甚至可以在alloc()中使用printf语句,并在返回之前打印allocp值,并进行多次迭代,看看会发生什么情况。

是的,可以从函数内的任何地方返回。