Код ошибки (это утечка памяти):
char* data = (char*) malloc(10);
data="123456789\0";
должно быть:
char* data = (char*) malloc(10);
strcpy(data, "123456789");
Это также означает, что вы ничего не можете сказать о выравнивании указателя в data
, тогда как назначение от malloc()
гарантирует, что данные достаточно хорошо выровнены для любого базового типа. Однако, это частично по касательной к вопросу о следующих двух строках:
const char *m_data = (const char *)data;
uint32_t i32 = *((uint32_t*)m_data);
Бросок в первой из этих линий не является необходимым, но не делает никакого вреда. Следующая строка обрабатывает указатель, хранящийся в m_data
, как указатель uint32_t
, разыгрывает его и присваивает результат i32
. Если значение в m_data
поступило из data
, которое исходило от malloc()
, данные были бы достаточно хорошо выровнены, чтобы это не было проблемой. При назначении строки нет гарантии, что указатель в m_data
достаточно хорошо выровнен для использования в качестве указателя uint32_t
. Так что все ад может сломаться, или, может быть, все в порядке. Поведение не определено из-за утечки памяти.
Байт функции NS()
байтов - 16-разрядное целое число. Функция NL()
меняет 16-разрядные значения в 32-битовом целое. Это означает, что вы начинаете со значения, показанного на диаграмме «Пуск», и заканчиваетесь значением, показанным на диаграмме «Готово».
+------+------+------+------+
| MSB | NMSB | NLSB | LSB | Start
+------+------+------+------+
+------+------+------+------+
| LSB | NLSB | NMSB | MSB | Finish
+------+------+------+------+
m_data += 4u;
добавляет 4 к указателю m_data
, поэтому вместо того, чтобы указывать на 1
строки, она указывает на 5
.
@Kevin. Помимо прошивки наложения, проблем нет. – 2501
@ 2501 Неплохо, я читал это как хранение указателя в uint32 в какой-то момент, а не uint32 *. – Kevin