Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conceptual problem in Union

Tags:

c++

c

unions

My code is this

// using_a_union.cpp
#include <stdio.h>

union NumericType
{
    int         iValue;
    long        lValue;  
    double      dValue;  
};

int main()
{
    union NumericType Values = { 10 };   // iValue = 10
    printf("%d\n", Values.iValue);
    Values.dValue = 3.1416;
    printf("%d\n", Values.iValue); // garbage value
}

Why do I get garbage value when I try to print Values.iValue after doing Values.dValue = 3.1416? I thought the memory layout would be like this. What happens to Values.iValue and Values.lValue; when I assign something to Values.dValue ?

like image 318
Joel Avatar asked Nov 17 '10 04:11

Joel


1 Answers

In a union, all of the data members overlap. You can only use one data member of a union at a time.

iValue, lValue, and dValue all occupy the same space.

As soon as you write to dValue, the iValue and lValue members are no longer usable: only dValue is usable.


Edit: To address the comments below: You cannot write to one data member of a union and then read from another data member. To do so results in undefined behavior. (There's one important exception: you can reinterpret any object in both C and C++ as an array of char. There are other minor exceptions, like being able to reinterpret a signed integer as an unsigned integer.) You can find more in both the C Standard (C99 6.5/6-7) and the C++ Standard (C++03 3.10, if I recall correctly).

Might this "work" in practice some of the time? Yes. But unless your compiler expressly states that such reinterpretation is guaranteed to be work correctly and specifies the behavior that it guarantees, you cannot rely on it.

like image 177
James McNellis Avatar answered Nov 06 '22 11:11

James McNellis