c에서 공용체가 null인지 확인할 수 있습니까? 예를 들어 :C에서 유니온이 "초기화"되지 않았는지 확인하는 방법은 무엇입니까?
union{ char * name, struct Something * something ... }someUnion;
어떤 요소가 요소 바이스 체크를하지 않고, 초기화되지 않은 경우 확인하는 방법이 있나요?
감사합니다.
c에서 공용체가 null인지 확인할 수 있습니까? 예를 들어 :C에서 유니온이 "초기화"되지 않았는지 확인하는 방법은 무엇입니까?
union{ char * name, struct Something * something ... }someUnion;
어떤 요소가 요소 바이스 체크를하지 않고, 초기화되지 않은 경우 확인하는 방법이 있나요?
감사합니다.
네, 공용체의 모든 구성원이 포인터 유형 또는 정수 유형이고 초기화가 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.
}
그들이 동일한 메모리를 공유하기 때문에 동의합니다. – mihajlv
우연히 null 일 수 있습니다. 앱이 돌아갈 때마다 이런 일이 일어날 확률이 1/256입니다. – Gir
@Gir 그래서요? 실제로는 새로 할당 된 메모리 페이지가 0으로 초기화되기 때문에 "우연히"0이됩니다. OS에 의해 초기화되는 "0"은 사용자가 초기화하는 0과 어떻게 다릅니 까? – hirschhornsalz
아니요, 특정 목적의 플래그를 추가하지 않아도됩니다. 예를 들어 :
struct someStruct {
int initialized;
union {
char *name;
struct Something *something;
};
};
당신은 노조가 포함 된 데이터의 종류를 표시하는 대신 initialized
의 깃발을 저장할 수 있습니다. 일반적으로 Tagged union이라고합니다.
그건 내가 생각한거야. 감사. – mihajlv
모든 유니온이'u = {0}'으로 초기화되면 어떨까요? 'someU == defaultU'는 안전 할 수 있습니까? –
@pst :'{0}'은 (는) 하나 이상의 공용 멤버에 유효한 값입니다. 예를 들어, 질문에서'name'과'something'은 둘 다 포인터이기 때문에 유효한 값으로'NULL'을 가질 수 있습니다. –
"공용체가 null 인 경우"라는 질문은 C에서 의미없는 질문입니다. 공용체는 null이 아니거나 널이 될 수 없습니다. 요소가 포인터 또는 정수인 경우 해당 멤버는 null 또는 0과 각각 비교 될 수 있습니다. –