使结构具有非填充大小

时间:2018-05-12 05:08:32

标签: c binary

所以,我希望能够在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?

0 个答案:

没有答案