定义基本的分配函数

defining a rudimentary alloc function

这是 K&R 书 ch5 中的一个例子,这个例子是定义 alloc 函数的在第一个语句中 allocp += n; 他递增 allocp 然后递减它 allocp - n 这是我的第一个问题,我也无法理解 if condition block

if(condition is true)
 do something;

当他写return语句时,所以if角色将完成和return旧指针,并执行一个循环。并且无法到达所有 n 段。 我的第二个问题 在 if 中写 return 是真的,而不是在 if 块中写出来吗? 这是整个代码

#define ALLOCSIZE 1000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;
char *alloc(int n)
{
    if(allocbuf + ALLOCSIZE - allocp >= n ) // it fits
    {
        allocp += n;
        return allocp - n; // old p 
    }else
        return 0;

}

该函数应该是分配内存,return是一个指向已分配段的指针,而allocp只是用来跟踪已分配了多少内存。

if 语句中使用 return 是可以的,但根据经验,应该尽量避免从同一个函数中使用多个 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. 有一个 1000 字节的静态缓冲区,由

    表示
    static uint8_t allocbuf [ALLOCSIZE];
    
  2. 当用户通过 alloc() 调用请求 "n" 字节时,它会检查是否有足够的可用内存(请求是否适合 1000 字节)和 returns 是指向此分配请求开始的指针。 (可以有多个分配请求)。

  3. 第二次调用 alloc 时,你看到 allocp 指针已经指向最后一个 alloc 请求的第(结束地址 + 1)字节了吗? (如果你没有看到它,我建议你阅读 static 关键字的作用)所以,如果允许的话,你的新分配从 allocp 开始。否则,它 return 为 NULL。

如果您是编程新手,正如 Jabberwocky 所建议的那样,请准备好铅笔和纸,然后对多个 alloc 调用进行计算。您甚至可以在 alloc() 中使用 printf 语句并在它之前打印 allocp 值 returns,经过多次迭代,看看会发生什么。

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