使用不同结构指针的布局

问题描述 投票:0回答:1

TL;博士

如果我有两个结构体的前几个字段具有相同的布局,例如

struct Athis
struct Bthat
,我可以获取
Athis
的实例,然后使用
Bthat
来引用它以进行访问和/或修改那些初始成员/字段?

具有初始相同布局的两个不同结构

假设我有以下 2 个结构:

struct Athis { 
  int num;
  char *str;
  int *lst;
  unsigned int num_lst; 
  // end
}

struct Bthat { 
  int b_num;
  char *b_str;
  int *b_lst;
  unsigned int b_num_lst; 

  // more below
  char *b_not_b;
  bool b_hamlet; 
  long guildenst; 
  unsigned long rosencr;
}

我可以一直安全地这样做吗?

void do_stuff(struct Athis *a) {
  *a.num += 2; 
}

void main() { 
  struct Bthat b = {0};
  b.b_num = 5; 
  b.b_str = "In hiss eeaarrrr...";

  do_struff(&b);
}

换句话说,如果两个结构的初始字段的布局/顺序相同,我可以通过将任一结构的实例强制转换为两种类型/结构中的一个来修改它们吗,只要我限制自己只修改最初的“相同”字段?

为什么?

我相信在 HTSlib 代码中的某个地方,Marshall、Li 和/或 Bonfield 做了类似上面的事情,这……可以说让我感到惊讶。

我最终在自己的代码中做了一些事情,其中我有两个非常相似的结构,并且只需要访问这些结构的初始字段——我想到了他们做了什么。

c pointers memory struct
1个回答
0
投票

为了安全地执行此操作,

struct Athis
的实例应该是
struct Bthat
的第一个成员:

struct Athis { 
  int num;
  char *str;
  int *lst;
  unsigned int num_lst; 
  // end
};

struct Bthat { 
  struct Athis A;

  // more below
  char *b_not_b;
  bool b_hamlet; 
  long guildenst; 
  unsigned long rosencr;
};

现在您可以:

void do_stuff(struct Athis *a) {
  a->num += 2; 
}

void main() { 
  struct Bthat b = {0};
  b.A.num = 5; 
  b.A.str = "In hiss eeaarrrr...";

  do_stuff(&b.A);
}
© www.soinside.com 2019 - 2024. All rights reserved.