2013-01-11 4 views
0

누구도 data.idata.f이 왜 손상되었는지 말할 수 있습니까? 이 코드의 출처 인 웹 사이트는 설명하려고하지만 잘못된 문법과 많은 오타를 사용하므로 여기 누구라도 나를 도와 줄 수 있는지 궁금합니다.노동 조합원의 인쇄 결과를 설명 할 수 있습니까?

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C 프로그래밍

상기 코드는 컴파일되고 실행될 때, 그것이 만들어 낸 결과 다음

#include <stdio.h> 
#include <string.h> 

union Data 
{ 
    int i; 
    float f; 
    char str[20]; 
}; 

int main() 
{ 
    union Data data;   

    data.i = 10; 
    data.f = 220.5; 
    strcpy(data.str, "C Programming"); 

    printf("data.i : %d\n", data.i); 
    printf("data.f : %f\n", data.f); 
    printf("data.str : %s\n", data.str); 

    return 0; 
} 

답변

5

당신은 union의 목적을 오해하고 있습니다. union은 여러 유형의 값을 저장할 수있는 단일 변수로 사용됩니다. 그러나 union은 최대 데이터 멤버 유형에 충분한 공간 만 할당합니다. 따라서 한 번에 하나의 데이터 멤버 만 사용할 수 있습니다. 한 멤버의 값을 설정하면 다른 멤버가 무효화됩니다. 여러 데이터 멤버 값을 저장 할 수있게하려면

, 당신이하는 struct

+0

그래서 노동 조합은 기본적으로 다른 데이터 유형을 보유 할 수있는 변수입니까? – AnotherUser

+0

@ user1596244 예. –

4

귀하는 union입니다. 이는 한 번에 한 명의 회원 만 살 수 있음을 의미합니다. strcpy memebr에 str이 들어가면 i 멤버를 오버런 한 f 멤버 자체가 덮어 씁니다. float 또는 char[20] 멤버를 읽는 int 멤버로

data.i = 10; 

저장, 재미 값 및 정의되지 않은 동작을 생산하는 것입니다. float 부재로

data.f = 220.5; 

저장 이전에 저장된 int이 손실된다.

strcpy(data.str, "C Programming"); 

저장 str 부재에, 미리 저장된 float이 손실된다.

data.idata.f에 인쇄 된 값은 int resp로 해석되는 문자열의 일부 바이트입니다. float.

여러 회원을 동시에 사용하려면 struct이 필요합니다.

0

이 객체 "MYSTRUCT"를 사용할 필요는 다음에 "부동"다음에 "INT"를 가지고 문자열. 일부 또는 모든 항목을 인쇄 할 수 있습니다.

struct mystruct 
{ 
    int i; 
    float f; 
    char str[20]; 
}; 

이 객체 "myunion는"에 "INT"ALL 서로의 TOP에 중첩는 "부동"와 문자열 있습니다. 데이터는 한 번에 이러한 유형 중 하나만 "유효"합니다.(0) 또는 "int로서이 데이터를 취급"차별화하는 당신은 런타임에 "태그"에 값을 할당하는 것

#define INT 0 
#define FLOAT 1 

struct x 
{ 
    int type_tag; 
    union 
    { 
     int x; 
     float y; 
    } 
} 

:

union myunion 
{ 
    int i; 
    float f; 
    char str[20]; 
}; 

당신은 일반적으로 노동 조합이 같은 것을 사용합니다 "그것을 부유물로 취급하십시오"(1). 도움이

'희망 .. PSM

+0

당신은'노동 조합 '이라고 써야한다고 생각합니다. –

+0

@Michael Foukarakis - 오타가 수정되었습니다. 고맙습니다 :) – paulsm4

0

사실, unionstruct 다르다.

struct의 경우 각 구성원마다 메모리가 있습니다.

union의 경우 모든 구성원이 동일한 메모리에 배치됩니다. 따라서 실제로는 현재 한 명의 회원 만 있습니다. 따라서 모든 회원을 읽을 수는 없습니다.

관련 문제