联合内部的变量赋值差异

时间:2017-10-05 09:37:23

标签: c unions

我之前听说过关于联合的是它将为其中的最大变量分配内存空间。在这里,我试图分配相同的'价值以两种不同的方式,但最终有问题。

首先,

union h {
    int a;
    char b;
};

int main()
{
    union h h1;
    h1.b = 'X';
    printf("%d %c\n",h1.a, h1.b );
    return 0;
}

输出将是一个很大的随机数,然后是' X'

-1674402216 X

当我尝试将 h1.a 也分配到数字时

union h {
    int a;
    char b;
};

int main()
{   
    union h h1;
    h1.a = 1;
    h1.b = 'X';
    printf("%d %c\n",h1.a, h1.b );
    return 0;
}

这给出了输出

88 X

有人可以帮我弄清楚究竟发生了什么吗?

谢谢你:)

1 个答案:

答案 0 :(得分:4)

联盟成员在内存中占据相同的空间。 所以你的工会看起来像这样:

N-1 ...
    --------
N   ||X||a||
N+1 |   |a||
N+2 |   |a||
N+3 |   |a||
... |      |
    --------
    ...

(假设系统具有32位整数。)

通过分配X,您还修改了未初始化的a的一个字节。您的值(-1674402216)可以在基数16中解释为9C32A658。您的最低有效字节是58 HEX,这是X的ASCII代码,而您的其他三个字节保持其初始未初始化值。

在你的第二种情况下,你首先将int初始化为1(将所有但最不重要的字节设置为0),然后你被X覆盖的最低有效字节在解释为int时得到88(X的ASCII码),并且原始'X',什么时候 看着char成员。

不要忘记提及:这样的布局是实现定义的。标准确实说,正如你在评论中提到的那样,你实际上不应该同时访问最后写的成员,同时,通常的做法是使用它们来完成这一点(参见这个主题:Why do we need C Unions?What is the strict aliasing rule?)。