【发布时间】:2014-02-23 04:12:20
【问题描述】:
由于没有分配任何值的静态变量声明进入代码的 BSS 部分。它将自动初始化为零。
问题: 假设,如果声明静态指针没有任何赋值,那么地址或值是否应该为零?
【问题讨论】:
-
注意,dup 仅标记为 C。
-
看起来您对指针变量及其值有点困惑。请记住,指针变量本身就是一个变量,这意味着它有一个值,但在这种情况下,您可以将其值用作地址。
由于没有分配任何值的静态变量声明进入代码的 BSS 部分。它将自动初始化为零。
问题: 假设,如果声明静态指针没有任何赋值,那么地址或值是否应该为零?
【问题讨论】:
在 C 中,静态指针将被初始化为 null,draft C99 standard 部分 6.7.8 Initialization 段落 10 说:
具有静态存储持续时间的对象未显式初始化,则:
并包含以下项目符号:
——如果是指针类型,则初始化为空指针;
所以没有为它分配存储空间,它是一个空指针。另请注意,这是存储静态变量的实现定义的行为。
the C++ draft standard 的相关部分将是部分 8.5 Initializers 第 13 段,其中说(强调我的):
如果没有为对象指定初始化器,则该对象是默认初始化的;如果不执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值。 [注:具有静态或线程存储持续时间的对象是 零初始化,见 3.6.2。 ——尾注]
zero-initialize 包含在第 6 段中,它说:
对 T 类型的对象或引用进行零初始化意味着:
并有以下项目符号:
——如果T是标量类型(3.9),则将对象设置为值0(零),作为整数常量表达式,转换为T;103
脚注103 说(强调我的):
如 4.10 中所述,将值为 0 的整型常量表达式转换为 指针类型会产生空指针值。
【讨论】:
指针将指向地址零(在大多数系统上为 NULL)。在将其用作指针之前,您仍需要将其指向有效的位置(例如来自 malloc)。
【讨论】: