У меня есть большой массив символов, который функционирует как пул памяти, и я хочу сохранить указатель в первой позиции массива, который указывает на то, какой будет следующая открытая позиция в пуле, поэтому каждый раз, когда что-то выделяется для пула, указатель будет указывать на байт, который следует за теми, которые были только что выделены. Моя единственная проблема в том, что я не совсем уверен, как сохранить указатель в массиве и затем иметь возможность изменять его в других функциях, поскольку единственное место, где будет существовать указатель, находится в позиции массива [0]. Кто-нибудь может указать мне правильное направление на это?
массив char объявлен так:
char pool[size];
Если вы не можете следовать рекомендациям других ответов, потому что вам абсолютно необходимо использовать пул для хранения всей информации в нем, самый безопасный способ хранения целочисленной информации в массиве 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)]
,
Что вам действительно нужно, так это индекс в этом массиве, который говорит вам, куда вставить.
Вы можете объявить структуру:
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 **pPoolEnd = (char **) pool;
инициализировать указатель, который вы хотите.
*pPoolEnd = pool + sizeof(char **);
чтобы он указывал на свой собственный конец (например, когда в пуле больше ничего нет).
Однако, почему вы хотите это сделать? Это сбивает с толку, подвержено ошибкам и, вероятно, не нужно. Другие указали на гораздо лучшие альтернативы. Предполагая, что у меня был такой пул, я бы, вероятно, выбрал один из них или просто использовал отдельный указатель, char *poolEnd
вместе с pool
,
Кроме того, плохой стиль — предоставлять детали вашей реализации пользователям («указатель конца пула находится в пуле [0]»), и еще хуже ожидать, что они будут иметь с ними дело («пожалуйста, обновляйте пул [0] всякий раз, когда вы хотите выделить»). из бассейна «). Считать malloc
а также free
; Предоставьте пользователям простые интерфейсы функций.