2013-08-19 3 views
1

변수 a는 값 10으로 지정되고 변수 b는 유니온 변수 v와 함께 20으로 할당됩니다. 그러면 a의 출력은 10 대신 20이됩니다. 그것.두 개의 값을 공용 변수로 할당

#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; 
} 

나는 프로그램을 실행했고 나는 20 개의 결과를 얻었다.

+0

당신이 무엇을 요구하고 있는지 확실하지 않습니다. 그러나 [Google] (https://www.google.com/search?q=c+union)에는 C 노조에 관한 많은 정보가 있습니다 –

+0

Thanks @JensGustedt. 오해의 소지가있는 설명을 삭제했습니다. (가장 최근에 작성된 필드를 읽는 것으로 가정합니다) – Himanshu

답변

4

union 오버레이 서로의 상단에 나열된 모든 부재 (일부 중첩 초기 부분보다 더 연장 될 수 있지만)은 동일한 메모리 부분에 기록된다. 이를 염두에두고 출력물을 이해해야합니다.

당신이 정말로 트위스트 시나리오에서 10

의 출력을 기대한다면 당신은 아마 struct의 행동을 생각하고, 그것은 동시에 노동 조합에 저장된 다른 값의 일부를 가지고하는 것이 가능하지만, 일반적으로 부분적으로 덮어 쓰기 값은 손상된 것으로 간주됩니다. 예를 들어,이 :

union { 
    char a; 
    struct { char ba; char bb; } b; 
} s; 

동시에 s.as.b.bb를 저장할 수 있지만, s.a 이후 s.b.bas.a 발을 굴러에 할당 s.b.ba를 중복하지 않으며, 암시 적으로 s.b 모두가 더 이상 신뢰할 수 있습니다.

종종 다른 유형을 저장하기위한 노동 조합은 조합원이 사용하고 그 첫 번째 구성원 기록 구조체에 포함됩니다

: 표시하기 위해 여기

struct { 
    int type; 
    union { 
     char ch; 
     int n; 
    } datum; 
} atom; 

type 아마 열거 값을 포함 할 datum.ch 또는 datum.n 여부 원자에서 사용되었다.

0

union이 두 가지 방법으로 struct 다릅니다

  • 공간
  • Only one value (그들은 모두 int있어 이후, 노조의 크기가 전체 int입니다) 존재하는 가장 큰 유형에 할당 언제든지 union에 저장할 수 있습니다. union의 구성원을 인쇄 할 때 하나가 다시 그 값을 수신해야

당신이 v에 저장 마지막 값은 20입니다.

두 멤버 모두에게 액세스하려면, 대신 struct을 사용하고 싶을 것입니다.

+0

값을 a = 10 및 b = 20으로 지정하려면 유니온을 사용할 수 있습니까? ?? 가능하다면 구조체를 사용해야합니다. 어떻게 합집합을 사용하여이 값을 얻을 수 있습니까? – Vaibhav

+0

** ** ** 동작을 원하면'struct'을 사용하십시오. – Makoto

+0

@Vaibhav 왜 그것이 무엇인지 또는 무엇을위한 것인지 모를 때 왜 조합을 사용하려고합니까? 왜 * 구조체를 사용하지 않습니까? –

1

이것은 유용한 질문입니다. 다음과 같이 할당을 바꾸어보십시오.

v.b=20; 
    v.a=10; 

결과를 확인하십시오. 당신이 ab을 원하는 경우로,보다는 구조를 사용하여 서로 중첩보다는 공존 :

#include<stdio.h> 
int main() 
{ 
    struct var 
    { 
     int a, b; 
    }; 
    struct var v; 
    v.a=10; 
    v.b=20; 
    printf("%d\n", v.a); 
    return 0; 
} 

당신은 결과를 원하는 받아야합니다. 그러나 var 구조에는 이제 두 개의 정수가 포함됩니다.

0

원시 int 크기는 32 비트라고 가정합니다.

C/C++의 공용 데이터 형식 개념은 다음과 같습니다. 동일한 메모리 위치에 다른 데이터 형식을 저장할 수 있습니다. 많은 멤버, 이있는 노동 조합을 정의 할 수 있지만 주어진 시간에 하나의 멤버 만 값을 포함 할 수 있습니다. 노동 조합의 크기는 그것의 가장 큰 구성원을 포함하기에 충분합니다. 귀하의 경우

: 모두 'A'& 'B'는 INT 타입이므로 'VAR 노조의 크기는 32 비트이다.

크기가 32 인 이진 배열을 상상해보십시오. 하자 그것은 A [32]. 최소 5 개의 유효 비트는 01010, 즉 'v.a'에 할당 된 10의 이진 형식을 저장한다. 다음으로 'v.b'에 20을 대입하면 10100 (20의 이진 형식)이 01010을 대체하게됩니다. 따라서 현재 10100을 갖는 유니온 v가 메모리 공간입니다.

'v.a'에 액세스하면 해당 메모리 위치의 현재 값이 반환됩니다.

는 하나 개의 값을 할당 할 수 있습니다 시간에 노동 조합에서 링크 wikipedia link

1

를 참조하십시오. 공용체에서 값은 서로 중첩됩니다. 그래서 여러분은 union의 두 요소에 값을 할당하는 것이 잘못되었습니다. 마지막으로 할당 된 값이 항상 표시됩니다. 그래서 만약 당신이 값을 억세스한다면 그것은 마지막으로 업데이트 된 값을 보여줄 것입니다.

관련 문제