Из ваших комментариев звучит то, что вы действительно делаете, упаковываете и распаковываете кучу разнородных типов данных в один блок памяти. В то время как вы можете делать это с помощью прямого приведения указателя, как и предлагали большинство других ответов:
void set_int(void *block, size_t offset, int val)
{
char *p = block;
*(int *)(p + offset) = val;
}
int get_int(void *block, size_t offset)
{
char *p = block;
return *(int *)(p + offset);
}
Проблема в том, что это непереносимо. Нет общего способа гарантировать, что типы хранятся в вашем блоке с правильным выравниванием, а некоторые архитектуры просто не могут загружать или сохранять по невыровненным адресам. В особом случае, когда компоновка вашего блока определяется объявленной структурой, все будет в порядке, потому что компоновка структуры будет включать в себя необходимые отступы для обеспечения правильного выравнивания. Однако, поскольку вы не можете получить доступ к членам по имени, похоже, что это на самом деле не то, что вы делаете.
Для этого нужно использовать memcpy
:
void set_int(void *block, size_t offset, int val)
{
char *p = block;
memcpy(p + offset, &val, sizeof val);
}
int get_int(void *block, size_t offset)
{
char *p = block;
int val;
memcpy(&val, p + offset, sizeof val);
return val;
}
(аналогично для других типов).