【问题标题】:Is a global pointer initialized to zero?全局指针是否初始化为零?
【发布时间】:2013-12-26 17:49:50
【问题描述】:

我想知道 cpp 标准对全局初始化有何规定。我发现this 的回答很有帮助,但没有提到指针类型。

是否可以保证这会奏效?

char* myptr
int main()
{
    if (myptr == NULL)
    {
        std::cout << "All good!" << std::endl;
    }
}

【问题讨论】:

    标签: c++ pointers global-variables


    【解决方案1】:

    是的,在命名空间范围(在您的情况下为全局命名空间)定义的指针保证被初始化为该类型的正确空指针值。

    对于标准参考,

    3.6.2[basic.start.init]/2 "具有静态存储持续时间的变量...应为零初始化 (8.5)"

    8.5[dcl.init]/6"要零初始化……意思是:如果T是标量类型(3.9),则将对象初始化为整型字面量转换得到的值 0(零)到 T;[106]"

    106) 如 4.10 中所述,将值为 0 的整数文字转换为指针类型会导致 空指针值

    (强调我的)

    【讨论】:

    • @Jefffrey 3.7.1[basic.stc.static]/1 "所有没有动态存储时长、没有线程存储时长、非本地变量都有静态存储时长"
    • @Jefffrey 全局变量什么时候到期?
    • @Jefffrey 抱歉,我的斗篷和紧身衣还在干洗店。
    • 不过,小心!在“独立”系统(与为您提供库和运行时的“托管”系统相反)上,它可能不会被归零。这主要是嵌入式和内核软件工程师的问题,但值得记住的是,在这两种情况下存在风险。
    【解决方案2】:

    我会在@Cubbi 的上一篇文章中附加,根据相同的标准,标量类型是

    算术类型(3.9.1)、枚举类型、指针类型、指向的指针 成员类型 (3.9.2)、std::nullptr_t 和 cv 限定版本 这些类型(3.9.3)统称为标量类型

    然后

    具有静态存储持续时间的非局部变量被初始化为 程序启动的结果。

    具有静态存储持续时间 (3.7.1) 或线程存储的变量 持续时间(3.7.2)应在任何其他之前被零初始化(8.5) 初始化发生。

    【讨论】:

    • @John Dibling 在我看来,这已经足够相关了。我让我的答案更完整,不会有你这样的问题。
    • 我认为这填补了第一个引用的空白。
    • @Bartlomiej Lewandowski 起初我只想给出标量类型的定义,很明显指针是标量类型。但是当我看到有人无法理解我的想法时,我又添加了一个引号。:)
    • @John Dibling,请阅读第一篇文章中的引用“零初始化......意味着:如果 T 是标量类型(3.9)”,我解释说指针是标量类型.
    • 啊,现在我明白了。也许我需要更多的咖啡。或者我应该休息一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多