Microsoft KB Archive/47693

= INFO: Initializing Unions Initializes First Member of the Union =

Article ID: 47693

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft C Professional Development System 6.0a
 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 1.5 Professional Edition
 * Microsoft Visual C++ 1.51
 * Microsoft Visual C++ 1.52 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 2.1
 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition

-



This article was previously published under Q47693





SUMMARY
When initializing a union, the initialization value is applied to the first member of the union even if the type of the value matches a subsequent member. As stated in the ANSI Standard, Section 3.5.7: A brace-enclosed initializer for a union object initializes the member that appears first in the declaration list of the union type. Because you cannot initialize the value of any member of a union other than the first one, you must assign their values in a separate statement. Initializing a union with a value intended for a subsequent member causes that value to be converted to the type of the first member.



MORE INFORMATION
The following example demonstrates the issue:

Sample Code
/* Compile options needed: none

union { int  a;        float b;      } test = {3.6};    /* This is intended to initialize 'b'      */ /* however, the value will be converted   */ /* (first to a long and then to an int)   */ /* in order to initialize 'a'. */
 * 1) include 

void main (void) {  float dummy = 0.0;            /* This causes the floating point  */ /* math package to be initialized. */                                 /* Not necessary with VC++ for     */ /* Windows NT. */

printf (&quot;test.a = %d, test.b = %f\n&quot;, test.a, test.b); } The output from the example, though not what is intended, is as follows:   test.a = 3, test.b = 0.00000 To associate a value with &quot;b&quot;, you can reverse the order of the members, as in the following: union { float b;       int a;      } test = {3.6}; Or, you can retain the order of the elements and assign the value in a separate statement, as in the following: test.b = 3.6; Either of these methods creates the following output:   test.a = 26214, test.b = 3.600000 Under Windows NT, the output would be as follows:   test.a = 1080452710, test.b = 3.600000

