Jadikan struct memiliki ukuran non-padded [duplikat]

Jadi, saya ingin dapat menulis data biner dalam C yang bergantian antara satu byte dan bilangan bulat bertanda 32-bit, dan memiliki tipe struct yang dapat digunakan untuk ini dengan penambahan pointer.

Sejauh ini, ini adalah struct saya

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

Dan ini kode saya

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;
}

Namun, hasil dari program ini adalah ini

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

Jadi ini menetapkan ukuran struct MarkedInt saya menjadi 8, membuat anggota tanda menjadi 4 byte, bukan 1. Hal ini menyebabkan beberapa padding yang tidak diinginkan, di mana penunjuk ke struct yang digunakan untuk membaca data biner akan membaca 8 byte sekaligus dan bukan 5 .

Hasil yang saya inginkan adalah ini

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);

Apakah mungkin melakukan ini di c? Atau apakah disarankan hanya membaca penanda byte dan int secara terpisah?


person Josh Weinstein    schedule 12.05.2018    source sumber
comment
Anda bertanya, apakah mungkin melakukannya di C, dan jawabannya adalah tidak mungkin melakukannya di C, tapi mungkin bisa dilakukan dengan beberapa ekstensi dan ya, lebih disukai caranya adalah dengan membaca secara terpisah.   -  person Antti Haapala    schedule 12.05.2018