2010-11-20 4 views
0

아무도 나에게 왜 다음 코드가 10 대신 20을 인쇄하는지 설명해 주시겠습니까?다음 코드의 출력 .. Union

덕분에 노동 조합의 정의에

#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

게시하기 전에'union '정의를 읽었습니까? – ruslik

답변

3

: 두 필드가 같은 주소를 공유하기 때문에 동시에 v.av.b을 사용할 수 없습니다.

노조 유형이 부재의 중복 비어 있지 않은 세트가 개체를 설명 선택적으로 지정된 이름과 아마도 구별 유형이있는 각 있는 : 표준을 인용합니다.

여기에서 v.b에 지정하면 v.a을 무시합니다. 두 변수의 유형이 같기 때문에 상황이 추악하지는 않지만, afloatb 인 경우를 상상해보십시오.

var이 두 개의 다른 int을 포함하는 복합 변수가되도록하려면 union이 아닌 struct을 사용해야합니다.

0

유니언은 포함 된 가장 넓은 유형을 저장할만큼 충분히 넓으며 유형은 동일한 주소를 공유합니다. ab을 구별하려면 struct을 사용하십시오. C99 표준에서

, 섹션 6.7.2.1 :

노조의 크기는 회원들의 가장 큰를 포함 할 SUF 과학 효율적인이다. 의 값은 대부분의 구성원 중 하나를 조합 개체에 언제든지 저장할 수 있습니다. 적절하게 변환 된 유니온 객체에 대한 포인터는 각 멤버를 가리키며 (또는 멤버가 비트 필드 인 경우), 그 반대의 경우도 마찬가지입니다. 섹션 6.5.8에서

: 같은 노조 개체의 멤버

모든 포인터는 동등 비교합니다.

0

유니온은 다른 유형 수정 자와 동일한 메모리에 대한 액세스를 제공하는 것입니다. 따라서 두 번째 할당이 존재하기 때문에 코드에서 첫 번째 할당은별로 의미가 없습니다. 마지막 순서대로 메모리에 영향을 미치므로 마지막으로 할당 된 값을 얻습니다.