Сохранить и получить адрес / указатель на массив символов

Допустим, у нас есть массив символов:

char pool[1000];

и указатель

char* ptr;

указатель хранит адрес блока данных в пуле. Я хочу сохранить этот адрес в пуле и получить его.

По сути, я хочу создать связанный список, который встроен в массив char. Причина в том, что мне не разрешено создавать какие-либо новые переменные (глобально), и я не могу включать новые заголовки, помимо других ограничений.

Таким образом, вопрос заключается в следующем: как мне сегментировать и разместить 4-байтовый адрес в (скажем) первых 4 элементах пула [], и как мне получить его снова для модификации.

Эта операция будет происходить часто, поэтому она должна быть быстрой... и, конечно, не полагаться на внешние функции.

2 ответа

Для хранения стоимости ptr в pool, используйте:

memcpy(pool, &ptr, sizeof(ptr));

Чтобы получить значение указателя из pool, используйте:

memcpy(&ptr, pool, sizeof(ptr));

Re:

Эта операция будет происходить часто, поэтому она должна быть быстрой... и, конечно, не полагаться на внешние функции.

memcpy это именно то, что вам нужно. Если вы не можете использовать memcpyвам нужно будет реализовать точную функциональность в вашем коде.

Если вы не можете проверить, что звонки на memcpy является узким местом производительности, я бы посоветовал использовать его.

Если вы хотите хранить ptr в пуле, тогда вы должны вместо этого иметь пул адресов?

char *pool[1000];

затем

pool[0] = ptr;
ptr = pool[0];
etc.

Если вам приходится иметь дело с буфером символов, то есть

char pool[1000];

но обработайте его как буфер адресов, затем согните его, создав локальную переменную:

char **pp = reinterpret_cast<char**>(&pool);
*pp = ptr;

Позднее сохраняет ptr в начале пула буферов. Чтобы получить его:

ptr = *pp;

Вы можете перемещаться по бассейну, увеличивая указатель pp

pp++ // next address

И не думайте, что адрес 4 байта!

Другие вопросы по тегам