Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查C中的联合是否未被;已初始化";?_C_Null_Unions - Fatal编程技术网

如何检查C中的联合是否未被;已初始化";?

如何检查C中的联合是否未被;已初始化";?,c,null,unions,C,Null,Unions,我可以检查c中的并集是否为null吗?例如: union{ char * name, struct Something * something ... }someUnion; struct someStruct { int initialized; union { char *name; struct Something *something; }; }; 是否有一种方法可以在不进行元件虎钳检查的情况下检查元件是否已初始化 谢谢。不,除

我可以检查c中的并集是否为null吗?例如:

union{ char * name, struct Something * something ... }someUnion;
struct someStruct {
    int initialized;
    union {
        char *name;
        struct Something *something;
    };
};
是否有一种方法可以在不进行元件虎钳检查的情况下检查元件是否已初始化


谢谢。

不,除非为此添加了特定的标志。例如:

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

您甚至可以存储一个标志,而不是
initialized
,该标志指示联合包含哪种类型的数据。这通常被称为a。

是的,在联合的所有成员都是指针类型或整数类型的情况下,初始化意味着分配了一个非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. 
}

我就是这么想的。谢谢。如果每个联合都初始化为
u={0}
;然后可以安全地
someU==defaultU
?@pst:
{0}
可能是一个或多个联合成员的有效值。例如,在问题中,
name
something
都可以将
NULL
作为有效值,因为它们都是指针。
union foo obj={0}始终有效;它将第一个成员初始化为类型的适当零值(必要时递归定义)。从C99开始,您还可以使用指定的初始值设定项:
union foo obj={.initialized=0}。但是请注意,您不能在联合定义中指定初始值设定项。@pst,默认的初始值设定项
{0}
仅初始化联合的第一个成员。如果您有比第一个成员更宽的其他成员,则它们可能没有正确初始化。在C中询问“联合是否为null”是一个毫无意义的问题。联合不能为null或非null。如果它有一个元素是指针或整数,则该成员可以分别与null或零进行比较。它可能是null。每次应用程序运行时,发生这种情况的概率为1/256runs@Gir那又怎么样?实际上,它更经常是“偶然”为0,因为新分配的内存页是由操作系统用0初始化的。操作系统初始化的“0”与用户初始化的0有何不同?