синтаксический аналог memcpy

179
18 июля 2018, 07:20

помогите сделать без memcpy то же самое:

char in[10] = {0};
int value = 13415;
memcpy(in, &value, sizeof(value));
Answer 1

Вариант с переинтерпретацией массива char [10] как lvalue типа int при помощи каста ((int &) in = value; и т.п.) - это грубое нарушение strict aliasing и неопределенное поведение в обоих языках, как уже было сказано в комментариях. Поэтому тут либо memcpy, либо его рукописный аналог.

Есть еще вариант, который делает почти то же самое, без memcpy

union { char in[10]; int value; } u = { 0 };
u.value = 12345;

после чего сразу смотрим в u.in и видим там результат.

Проблема, однако, в том, что использовать union таким способом формально разрешено именно в С, но не в С++. Но на это еще можно закрыть глаза. А вот на (int &) in = value; закрыть глаза нельзя.

Answer 2

Используйте цикл:

char in[10] = {0};
int value = 13415;
for (size_t i = 0; i < sizeof value; i++)
    in[i] = ((char*)&value)[i];

Но если есть возможность, просто возьмите memcpy(). Цикл ничем не лучше, а если включите оптимизацию, то и цикл, и memcpy() все равно превратятся в одно и то же.

В соседнем ответе предлагают (*(int*)(in))=value; (он же (int&)in = value;), но это нарушает strict aliasing и приводит к неопределенному поведению. Так лучше не делать.

Answer 3

Можно со сдвигами поизвращаться

int value = 13415;
char in[10] = { value, value >> 8, value >> 16, value >> 24 };
Answer 4
(*(int*)(in))=value;

Должно сработать.

READ ALSO
ESP8266 SPI slave mode interrupt (Arduino IDE)

ESP8266 SPI slave mode interrupt (Arduino IDE)

Есть необходимость запустить аппаратный (желательно) SPI в режиме slave на ESP12f (ESP8266)SPI0 используется для доступа к флешке - его не трогаем

328
Имя интернет сети с++

Имя интернет сети с++

Как узнать имя интернет сети к которой подключен компПодключен ли интернет проверяю так:

176
Создание статических ссылок для Apache Tomcat

Создание статических ссылок для Apache Tomcat

Создал сервер под Tomcat, задача которого помещать определенные xml в очередь сообщенийВыбор xml'я реализовал в соответствующем классе в зависимости...

212
Как отрендерить картинку в OpenGL с STB Image

Как отрендерить картинку в OpenGL с STB Image

Как отрендерить картинку используя LWJGL, STB Image?

184