хранение и получение указателя в массиве в переполнении стека

У меня есть большой массив символов, который функционирует как пул памяти, и я хочу сохранить указатель в первой позиции массива, который указывает на то, какой будет следующая открытая позиция в пуле, поэтому каждый раз, когда что-то выделяется для пула, указатель будет указывать на байт, который следует за теми, которые были только что выделены. Моя единственная проблема в том, что я не совсем уверен, как сохранить указатель в массиве и затем иметь возможность изменять его в других функциях, поскольку единственное место, где будет существовать указатель, находится в позиции массива [0]. Кто-нибудь может указать мне правильное направление на это?

массив char объявлен так:

char pool[size];

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)],

0

Другие решения

Что вам действительно нужно, так это индекс в этом массиве, который говорит вам, куда вставить.

Вы можете объявить структуру:

struct pool
{
char poolData[size];
int insertIndex;
};

Так что у вас всегда есть память пула и индекс, куда вы хотите вставить их вместе. Или просто создайте отдельную переменную и передайте их вместе тому, кому нужно ее использовать.

char pool[size];
int insertIndex;

Нет необходимости «захватывать» первый элемент массива и использовать его иначе, чем остальной массив; просто объявите другую переменную, чтобы отслеживать состояние пула.

1

Я думаю, что вам нужен индекс, чтобы запомнить, где находится следующее пустое место в пуле (изначально будет ноль).

char pool[size];
int index = 0;

Затем каждый раз, когда вы вставляете новый элемент, вы просто увеличиваете его:

if(index < size) {
pool[index] = 123;
index++;
}
0

char **pPoolEnd = (char **) pool;

инициализировать указатель, который вы хотите.

*pPoolEnd = pool + sizeof(char **);

чтобы он указывал на свой собственный конец (например, когда в пуле больше ничего нет).

Однако, почему вы хотите это сделать? Это сбивает с толку, подвержено ошибкам и, вероятно, не нужно. Другие указали на гораздо лучшие альтернативы. Предполагая, что у меня был такой пул, я бы, вероятно, выбрал один из них или просто использовал отдельный указатель, char *poolEnd вместе с pool,

Кроме того, плохой стиль — предоставлять детали вашей реализации пользователям («указатель конца пула находится в пуле [0]»), и еще хуже ожидать, что они будут иметь с ними дело («пожалуйста, обновляйте пул [0] всякий раз, когда вы хотите выделить»). из бассейна «). Считать malloc а также free; Предоставьте пользователям простые интерфейсы функций.

0
По вопросам рекламы [email protected]