2012-05-10 2 views
4

c에서 공용체가 null인지 확인할 수 있습니까? 예를 들어 :C에서 유니온이 "초기화"되지 않았는지 확인하는 방법은 무엇입니까?

union{ char * name, struct Something * something ... }someUnion; 

어떤 요소가 요소 바이스 체크를하지 않고, 초기화되지 않은 경우 확인하는 방법이 있나요?

감사합니다.

+0

"공용체가 null 인 경우"라는 질문은 C에서 의미없는 질문입니다. 공용체는 null이 아니거나 널이 될 수 없습니다. 요소가 포인터 또는 정수인 경우 해당 멤버는 null 또는 0과 각각 비교 될 수 있습니다. –

답변

1

네, 공용체의 모든 구성원이 포인터 유형 또는 정수 유형이고 초기화가 NULL이 아닌 값이 할당되었다는 조건하에 하나를 요소가 NULL인지 확인하는 것으로 충분합니다.

union { 
    char * name; 
    struct Something * something; } someUnion; 

if (someUnion.name != 0) { 
    // here you know that someUnion.something is not NULL too. 
    // You don't know if it has been initialized as char* 
    // or as struct something* though. Presumeably since 
    // it is a unionboth interpretations make some sense. 
} 
+0

그들이 동일한 메모리를 공유하기 때문에 동의합니다. – mihajlv

+0

우연히 null 일 수 있습니다. 앱이 돌아갈 때마다 이런 일이 일어날 확률이 1/256입니다. – Gir

+0

@Gir 그래서요? 실제로는 새로 할당 된 메모리 페이지가 0으로 초기화되기 때문에 "우연히"0이됩니다. OS에 의해 초기화되는 "0"은 사용자가 초기화하는 0과 어떻게 다릅니 까? – hirschhornsalz

6

아니요, 특정 목적의 플래그를 추가하지 않아도됩니다. 예를 들어 :

struct someStruct { 
    int initialized; 
    union { 
     char *name; 
     struct Something *something; 
    }; 
}; 

당신은 노조가 포함 된 데이터의 종류를 표시하는 대신 initialized의 깃발을 저장할 수 있습니다. 일반적으로 Tagged union이라고합니다.

+0

그건 내가 생각한거야. 감사. – mihajlv

+0

모든 유니온이'u = {0}'으로 초기화되면 어떨까요? 'someU == defaultU'는 안전 할 수 있습니까? –

+0

@pst :'{0}'은 (는) 하나 이상의 공용 멤버에 유효한 값입니다. 예를 들어, 질문에서'name'과'something'은 둘 다 포인터이기 때문에 유효한 값으로'NULL'을 가질 수 있습니다. –

관련 문제