【问题标题】:Uninitialized C structure field [duplicate]未初始化的C结构字段[重复]
【发布时间】:2019-10-05 04:06:52
【问题描述】:

尝试访问 C 中未初始化的结构字段是否被视为未定义行为?

struct s { int i; };
struct s a;
printf("%d", a.i);

【问题讨论】:

  • 为什么它可能不同于访问任何其他未初始化的内存位置?
  • 据我记忆,只有全局变量和静态变量是零初始化的。访问任何其他都是UB。
  • 视情况而定。自动存储对象 - UB。静态存储对象 - 无 UB
  • 这个问题至少在“(为什么)使用未初始化的变量未定义行为?”中没有重复。请看 P__J__ 的第一个答案,将其与您认为存在重复的内容进行比较,您就会明白它们是两个不同的东西。谢天谢地,我希望你不要继续关闭我的问题。
  • @GovindParmar:在许多情况下,复制一个结构可能有用,其中一些但不是所有成员都已写入,其中一些情况可以概括为不同条件控制是否不同的情况。成员被写入,在某些情况下,函数可能根本不写入。作者认为没有必要告诉编译器编写者在没有任何理由不支持它们的情况下应该支持此类构造(例如捕获以避免可能的数据泄漏),因为他们希望编译器编写者无论如何都会这样做。跨度>

标签: c struct field undefined-behavior


【解决方案1】:

取决于变量的存储时长:

struct
{
    int a;
    int b;
}c;

int main()
{

    struct 
    {
        int a;
        int b;
    }e;

    static struct 
    {
        int a;
        int b;
    }s;

    printf("%d", c.a);    // <- correct no UB
    printf("%d", s.a);    // <- correct no UB
    printf("%d", e.a);    // <- UB 
}

结构c & s 有一个static 存储持续时间,并且它们总是被初始化。如果程序员没有以明确的方式初始化它们,它们就会被清零。

结构e具有自动存储持续时间,如果程序员没有显式初始化,它不会归零

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多