定义基本的分配函数
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;
}
您发布的代码片段确实 -
有一个 1000 字节的静态缓冲区,由
表示
static uint8_t allocbuf [ALLOCSIZE];
当用户通过 alloc() 调用请求 "n" 字节时,它会检查是否有足够的可用内存(请求是否适合 1000 字节)和 returns 是指向此分配请求开始的指针。 (可以有多个分配请求)。
第二次调用 alloc 时,你看到 allocp 指针已经指向最后一个 alloc 请求的第(结束地址 + 1)字节了吗? (如果你没有看到它,我建议你阅读 static 关键字的作用)所以,如果允许的话,你的新分配从 allocp 开始。否则,它 return 为 NULL。
如果您是编程新手,正如 Jabberwocky 所建议的那样,请准备好铅笔和纸,然后对多个 alloc 调用进行计算。您甚至可以在 alloc() 中使用 printf 语句并在它之前打印 allocp 值 returns,经过多次迭代,看看会发生什么。
是的,可以从函数内的任何地方 return。
这是 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;
}
您发布的代码片段确实 -
有一个 1000 字节的静态缓冲区,由
表示static uint8_t allocbuf [ALLOCSIZE];
当用户通过 alloc() 调用请求 "n" 字节时,它会检查是否有足够的可用内存(请求是否适合 1000 字节)和 returns 是指向此分配请求开始的指针。 (可以有多个分配请求)。
第二次调用 alloc 时,你看到 allocp 指针已经指向最后一个 alloc 请求的第(结束地址 + 1)字节了吗? (如果你没有看到它,我建议你阅读 static 关键字的作用)所以,如果允许的话,你的新分配从 allocp 开始。否则,它 return 为 NULL。
如果您是编程新手,正如 Jabberwocky 所建议的那样,请准备好铅笔和纸,然后对多个 alloc 调用进行计算。您甚至可以在 alloc() 中使用 printf 语句并在它之前打印 allocp 值 returns,经过多次迭代,看看会发生什么。
是的,可以从函数内的任何地方 return。