【发布时间】:2017-09-11 12:20:45
【问题描述】:
我有三个结构,它们共享第一个字段的第一个类型和名称:
struct TYPEA {
char *name;
int x,y; /*or whatever*/
};
struct TYPEB {
char *name;
float a[30]; /*or whatever*/
};
struct TYPEC {
char *name;
void *w,*z; /*or whatever*/
};
如果我没记错的话,结构的第一个字段必须从结构本身的相同地址开始。
这让我想知道工会是否也是如此:
union data {
struct TYPEA;
struct TYPEB;
struct TYPEC;
};
union data *p = function_returning_a_sane_default_for_union_data();
printf("%s", (char*) p);
对此我有 2 个问题:
- 是标准要求的联合体 始终将其内容放在同一个地址?
- 如果所有结构都具有相同的结构,它会起作用吗? 字段,只是名称不同?
【问题讨论】:
-
C 中没有“通用约定”。如果标准不保证什么,那取决于实现或者是 UB。该标准确实保证了这一点。实际的问题是:你为什么要关心?演员阵容是个坏主意。使用第一个元素。更好:将共同成员移动到一个拥抱
struct -
@Olaf 是的,我想我在考虑具体的实现是如何做到的;但由于我对标准感兴趣,所以我将其删除。没有它应该更清楚,谢谢。
-
能否请反对者解释他们的立场?这是今天要问的更好的 C 问题之一,恕我直言。
-
@Bathsheba:这是我不得不承认我投错票的少数几个场合之一。我首先认为它太宽泛了(主要是因为现在删除了部分),但是看到你的回答,经过对我自己的问题的研究,我认为这确实是一个很好的问题。我现在将反对票改为赞成票。很抱歉犯了错误。
标签: c struct unions memory-alignment pointer-conversion