2010-11-20 5 views
0

Quelqu'un peut-il s'il vous plaît expliquer moi pourquoi le code suivant imprimer 20 au lieu de 10?Sortie du code suivant .. Union

Merci

#include<stdio.h> 

int main() 
{ 
    union var 
    { 
     int a, b; 
    }; 
    union var v; 
    v.a=10; 
    v.b=20; 
    printf("%d\n", v.a); 
    return 0; 
} 
+2

Avez-vous lu la définition de 'union' avant de l'afficher? – ruslik

Répondre

3

Par définition d'une union: vous ne pouvez pas utiliser simultanément v.a et v.b parce que les deux champs partagent la même adresse. Pour citer la norme:

Un type d'union décrit un ensemble de recouvrement non vide d'objets membre, chaque qui a un nom spécifié éventuellement et éventuellement type distinct.

Ici, dès que vous attribuez à v.b, vous substituez v.a. Dans votre cas, les choses ne deviennent pas moche parce que les deux variables ont le même type, mais imaginez ce que si a était un float et b un caractère par exemple.

Si votre objectif est d'avoir var être une variable composé qui contient deux différents int, vous devez utiliser struct, non union.

0

Les syndicats seront assez larges pour stocker le type le plus large qu'il contient, et les types partageront les mêmes adresses. Si vous souhaitez que a et b soient distincts, utilisez un struct.

de la norme C99, section 6.7.2.1:

La taille d'une union est suf fi sante pour contenir le plus grand de ses membres. La valeur de la plupart des membres peut être stockée dans un objet union à tout moment. Un pointeur vers un objet union , convenablement converti, pointe vers chacun de ses membres (ou si un membre est un champ , puis vers l'unité dans laquelle il réside) et vice versa.

De section 6.5.8:

Tous les pointeurs vers des membres du même objet union comparer l'égalité.

0

Union est une chose qui donne accès à la même mémoire avec différents types modifie. Donc, dans votre code, le premier assignement n'a pas beaucoup de sens, car le second assignement existe. Il affecte la mémoire dans le dernier ordre, ainsi vous obtenez la dernière valeur assignée.