这是K&R书 ch5 中的一个示例,该示例定义了我得到的alloc函数,但是我陷入了困境,无法理解他为什么返回旧指针,并且在第一条语句{{1}中}他先递增allocp,然后递减allocp += n;
这是我的第一个问题,同样我也无法理解条件块
allocp - n
当他编写return语句时,如果角色将完成,则返回旧指针,并执行一个循环。并且无法覆盖所有n个细分受众群。 我的第二个问题是否在if块中写返回而不是在if块中写出来是真的吗? 这是整个代码
if(condition is true)
do something;
答案 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)
您发布的代码段确实有用-
具有1000个字节的静态缓冲区,表示为
static uint8_t allocbuf [ALLOCSIZE];
当用户通过alloc()调用“ n”个字节时,它将检查是否有足够的可用内存(该请求适合1000个字节)并返回一个指向此开头的指针。分配请求。 (可以有多个分配请求)。
第二次调用alloc,您会看到allocp指针如何指向最后一个alloc请求的第(结束地址+第1个)字节? (如果看不到它,建议您阅读static关键字的作用)。因此,如果允许的话,新分配将从allocp开始。否则,它将返回NULL。
如果您对编程非常陌生,如Jabberwocky所建议,请动笔,对多个alloc调用进行数学运算。您甚至可以在alloc()中使用printf语句,并在返回之前打印allocp值,并进行多次迭代,看看会发生什么情况。
是的,可以从函数内的任何地方返回。