我有一个大的char数组,它充当一个内存池,并希望将指针存储在数组的第一个位置,指向池中下一个打开位置的任何位置,所以每次将某些内容分配给池指针将指向刚刚分配的字节后面的字节。我唯一的问题是我不太确定如何将指针存储在数组中然后能够在其他函数中修改它,因为指针存在的唯一位置是在数组[0]位置。有人能指出我正确的方向吗?
char数组声明为:
char pool[size];
答案 0 :(得分:1)
你真正想要的是该数组的索引,它告诉你插入的位置。
您可以声明一个结构:
struct pool
{
char poolData[size];
int insertIndex;
};
这样您始终可以将池内存和索引放在一起。或者,只需要一个单独的变量并将它们传递给需要使用它的人。
char pool[size];
int insertIndex;
没有必要“劫持”数组的第一个元素,并且使用它与数组的其余部分不同;只需声明另一个变量来跟踪池的状态。
答案 1 :(得分:0)
我认为你需要的是一个索引来记住池中的下一个空位(最初将为零)。
char pool[size];
int index = 0;
然后每次插入一个新元素时,只需增加它:
if(index < size) {
pool[index] = 123;
index++;
}
答案 2 :(得分:0)
如果您不能遵循其他答案的建议,因为您绝对必须使用池来存储其中的所有信息,将整数信息存储在char数组中的最安全方法是使用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)]
。
答案 3 :(得分:0)
char **pPoolEnd = (char **) pool;
初始化你想要的指针。
*pPoolEnd = pool + sizeof(char **);
使其指向自己的目的(例如,当池中没有其他内容时)。
但是,你为什么要这样做?它令人困惑,容易出错并且可能没有必要。其他人指出了更好的选择。假设我首先有一个这样的池,我可能会选择其中一个,或者只使用一个单独的指针,char *poolEnd
和pool
。
此外,向用户公开您的实现细节是不好的风格(“池结束指针位于池[0]”),更糟糕的是期望他们处理它们(“请在每次更新时更新池[0]喜欢从池中分配“)。想想malloc
和free
;向用户公开简单的功能接口。