我有一个大型 char 数组,它用作内存池,并希望在数组的第一个位置存储一个指针,该指针指向池中的下一个打开位置,所以每次向池分配一些东西时,指针将指向刚刚分配的字节之后的字节。我唯一的问题是我不太确定如何将指针存储在数组中,然后能够在其他函数中修改它,因为指针存在的唯一位置是数组 [0] 位置。谁能指出我正确的方向?
char 数组声明如下:
char pool[size];
您真正想要的是该数组的索引,它告诉您在哪里插入。
你可以声明一个结构:
struct pool
{
char poolData[size];
int insertIndex;
};
这样您就始终拥有要一起插入的池内存和索引。或者,只需有一个单独的变量并将它们一起传递给需要使用它的任何人。
char pool[size];
int insertIndex;
没有必要“劫持”数组的第一个元素并以不同于数组的其余部分的方式使用它;只需声明另一个变量来跟踪池的状态。
我认为您需要一个索引来记住池中下一个空点在哪里(最初为零)。
char pool[size];
int index = 0;
然后每次插入新元素时,只需递增它:
if(index < size) {
pool[index] = 123;
index++;
}
如果您不能遵循其他答案的建议,因为您绝对必须使用池来存储其中的所有信息,那么将整数信息存储在 char-array 中的最安全方法是使用memcpy
(我使用的是 C++11句法):
#include <cstring>
#include <iostream>
int main()
{
using size_type = std::size_t;
static constexpr size_type size = 1000;
char pool[size];
/* Store 12 as integer information at the beginning
of the pool: */
size_type next_free = 12;
std::memcpy(pool,&next_free,sizeof(size_type));
/* Retrieve it: */
size_type retrieved = 0;
std::memcpy(&retrieved,pool,sizeof(size_type));
/* This will output 12: */
std::cout << retrieved << std::endl;
return 0;
}
当然,这意味着sizeof(size_type)
池的第一个条目不能用于存储任何实际字符。您实际可以使用的最低条目是pool[sizeof(size_type)]
.
char **pPoolEnd = (char **) pool;
初始化你想要的指针。
*pPoolEnd = pool + sizeof(char **);
使其指向自己的终点(例如,当池中没有其他内容时)。
但是,您为什么要这样做?它令人困惑,容易出错并且可能是不必要的。其他人则指出了更好的选择。假设我一开始就有这样一个池,我可能会选择其中一个,或者简单地使用一个单独的指针,char *poolEnd
以及pool
.
此外,将您的实现细节暴露给用户是不好的风格(“池结束指针位于池 [0]”),更糟糕的是期望他们处理它们(“请在您想要分配时更新池 [0]从游泳池”)。思考malloc
和free
;向您的用户公开简单的功能接口。