Сделать структуру не заполненной размером

Итак, я хочу иметь возможность записывать двоичные данные в C, которые чередуются между одним байтом и 32-разрядным целым числом со знаком, и иметь тип структуры, который можно использовать для этого с увеличением указателя.

Пока это моя структура

struct MarkedInt
{
  unsigned char mark;
  int value;
};

И это мой код

void clean_obj(struct MarkedInt* mi)
{
  mi->mark = 0;
  mi->value = 0;
}

int main(void) {

  struct MarkedInt a;
  clean_obj(&a);
  a.mark = 5;
  a.value = 500;

  unsigned char* printer = (unsigned char*)(&a);
  printf("sizeof a is %lu\n", sizeof(a));
  for(int i = 0; i< sizeof(a);i++)
  {
    printf("%u\n", printer[i]);
  }
  return 0;
}

Однако результат программы таков.

sizeof a is 8
5
4
64
0
244
1
0
0

Таким образом, он устанавливает размер моей структуры MarkedInt равным 8, делая элемент метки 4 байта вместо 1. Это вызывает нежелательное заполнение, когда указатель на структуру, используемую для чтения двоичных данных, будет считывать 8 байтов за раз, а не 5 .

Мой желаемый результат таков

unsigned char buf[] = {/*mark*/ 5, /*int value*/ 1, 0, 0, 0};
struct MarkedInt* reader = buf;
printf(" mark: %u, value: %d\n", reader->mark, reader->value);

Можно ли это сделать в c? Или просто рекомендуется читать байтовый маркер и int отдельно?


person Josh Weinstein    schedule 12.05.2018    source источник
comment
Вы спросили, возможно ли это сделать на C, и ответ: это невозможно сделать на C, но это возможно сделать с некоторыми расширениями, и да, предпочтительнее way читать отдельно.   -  person Antti Haapala    schedule 12.05.2018