如何检查结构是否在C中初始化?

如何检查结构是否在C中初始化?,c,C,我声明了一个结构,我想检查它是否已经初始化。我该怎么做 我试过: struct mystruct str1; if(str1 != NULL) if(str1->name != NULL) 该结构是一个链表,还包含int和char等类型的属性。如果在任何函数(包括main())之外声明该结构,则该结构及其内容将初始化为零。正如评论中指出的那样,对于不同的数据类型,这意味着不同的事情 整数(例如char、short、int、long、unsigned、unsigned int、long

我声明了一个结构,我想检查它是否已经初始化。我该怎么做

我试过:

struct mystruct str1;

if(str1 != NULL)

if(str1->name != NULL)
该结构是一个链表,还包含int和char等类型的属性。

如果在任何函数(包括
main()
)之外声明该结构,则该结构及其内容将初始化为零。正如评论中指出的那样,对于不同的数据类型,这意味着不同的事情

  • 整数(例如char、short、int、long、unsigned、unsigned int、long long等)将为0
  • float和double将是数字0.0[但它们所包含的字节可能不是]
  • 指针将为空
  • 结构填充可能未定义
  • 数组将根据其类型适当地归零
  • 如果在函数中定义结构或任何非静态变量,则它们是未定义的。在一些实现中,它们碰巧包含许多实现中堆栈上的内容,但这取决于体系结构。在任何情况下,您都可以假定在函数中声明的结构、数组和变量(前面没有静态字)未初始化并包含垃圾

    您通常不会测试结构是否已初始化,您只需要知道在中定义的情况,以及是否已初始化它(及其子元素)


    确定结构是否已初始化的唯一方法是检查其中的每个元素,看看它是否与您认为该元素的初始化值应该匹配。如果要检查指向结构的指针是否已初始化为预定义状态,只需查看它是否包含NULL或初始化到的特定地址。

    当然,它不会自动初始化。只要跟踪初始化它的时间就可以了?如果我没有弄错的话,简写的去引用->语法只用于指针。它们既不能保证全部
    0
    ,也不能保证
    NULL
    <代码>结构成员初始化为适当的零表示形式。指针是
    NULL
    'd、
    float
    s和
    double
    s,它们获取表示零的任何值,并且正常整数被归零。另一方面,填充物未被触碰。@a3f-感谢您的澄清。这是一个重要的区别。但它们被初始化为合理的值。一般来说,没有人关心填充,但在极少数情况下,这可能很重要,人们通常会检查浮点数和double是否为零,但您的观点是,如果您通过引用或强制转换它们,它们可能不是零。谢谢。同意最迂腐的例外:“它们包含堆栈上的任何内容”可能是真的,也可能不是真的。C甚至没有指定堆栈。(请参阅哈佛体系结构在许多嵌入式处理器中的使用。贝斯特说,本地非静态值未定义,请保持不变。另一个细节:“确定是否初始化了结构将检查每个元素”可能导致UB。例如,一个值可能有一个陷阱值,因此在设置它之前读取是程序的结束。@chux,我将根据您和a3f所说的内容更新我的答案。