Концептуально это нормально - но вам нужно проделать дополнительную работу, чтобы обеспечить его надежную работу.
Потенциальная проблема заключается в том, что вы не можете просто получить доступ к любому произвольному адресу как float
. Могут быть определенные требования выравнивание - адрес, возвращаемый malloc()
, должен быть правильно выровнен для доступа любого типа, но как только вы добавите 14 к этому адресу, все ставки отключены (кроме char
).
Чтобы обеспечить правильное выравнивание, вы должны убедиться, что адрес, который вы добавляете к buffer
, кратен sizeof(float)
. Вы можете сделать это, добавив отступ, используя следующую формулу:
#define PAD_OFFSET(offset, type) ((offset) + sizeof(type) - 1) & ~(sizeof(type) - 1))
float *float_buffer = (float *)(buffer + PAD_OFFSET(14, float));
Обратите внимание, что это создаст разрыв - отступ - между вашими символами и вашими поплавками.
В качестве альтернативы, вы можете определить struct
, и компилятор определит для вас отступы. При этом используется функция C99, называемая гибкий элемент массива :
struct foo {
char abc[14];
float xyz[];
};
struct foo *buffer = malloc(2062);
memcpy(&buffer->abc, header, 14);
some_function(&buffer->xyz);
transmit(buffer); /* Presuming transmit() expects a void * parameter. */
Если вы хотите сделать это без заполнения , вы не можете напрямую обращаться к памяти в buffer
как плавающие значения - вам нужно будет создать временный массив и скопировать его в:
float temp[500]; /* Or whatever size */
some_function(&temp);
memcpy(buffer + 14, temp, sizeof temp);