我知道静态变量必须用常量初始化,因为在程序开始运行之前,静态变量的值必须是已知的。因此,我们可以说不可能使用动态内存分配初始化静态变量,因为这意味着变量将在程序运行时初始化。另外,有人能解释一下为什么在main开始运行之前必须知道static变量的值吗?
y53ybaqx1#
关于你的标题问题:* 是否可以在c中动态初始化一个静态变量?答案是否定的。下面详细说明为什么……你下一个问题的答案:
是的,我们可以这样说,因为:
static int *array = calloc(5, sizeof(int));
将无法编译,因为初始化器元素不是编译时常量。它无法编译的原因在 C标准N1570第5.1.2 段中给出,其中明确指出:所有具有静态存储持续时间的对象应在程序启动前初始化(设置为其初始值)。但是,动态地将内存分配给一个正确初始化的static变量 * 是 * 法律的:
static
static int *array = NULL; //properly initialized static pointer variable. ... array = calloc(5, sizeof(int));// legal
最后一个问题的答案:* 为什么在main开始运行之前必须知道static变量的值?*可以从 * These statements... * 导出1.静态变量有一个属性,即使在它们超出其作用域之后也能保持其值!因此,静态变量在其 * 以前的作用域 * 中保留其 * 以前的值 ,并且不在新作用域中再次初始化。[强调我的]*1.静态变量是 * 在数据段中分配的内存,而不是堆栈段 。有关详细信息,请参阅C程序的内存布局。[强调我的]*1.静态变量(如全局变量)如果没有显式初始化,则初始化为0。例如,在下面的程序中,x的值被打印为0,而y的值是垃圾。[参见引用程序的链接]因此,根据定义,由于带有 * static storage duration * 的变量存在于程序的整个生命周期中,因此在运行时开始时,该内存空间中存在已知值是有意义的。(当main()开始运行时。)
main()
v2g6jxz62#
你所说的static是 static storage duration.。声明一个具有静态存储持续时间的变量实际上意味着在链接过程中,链接器将是为变量分配存储的那个。当链接器是分配存储的链接器时,这意味着变量将在.rodata部分(对于常量)或tec.data tec或.bss部分中具有单个地址。每个静态变量的初始值都写入(硬编码)到可执行文件中,并在调用main()函数之前由加载程序简单地复制到正确的地址。这就是为什么这些变量必须用常量初始化(否则它们是零初始化的)。
.rodata
.bss
2条答案
按热度按时间y53ybaqx1#
关于你的标题问题:* 是否可以在c中动态初始化一个静态变量?答案是否定的。下面详细说明为什么……
你下一个问题的答案:
是的,我们可以这样说,因为:
将无法编译,因为初始化器元素不是编译时常量。
它无法编译的原因在 C标准N1570第5.1.2 段中给出,其中明确指出:
所有具有静态存储持续时间的对象应在程序启动前初始化(设置为其初始值)。
但是,动态地将内存分配给一个正确初始化的
static
变量 * 是 * 法律的:最后一个问题的答案:* 为什么在main开始运行之前必须知道static变量的值?*
可以从 * These statements... * 导出
1.静态变量有一个属性,即使在它们超出其作用域之后也能保持其值!因此,静态变量在其 * 以前的作用域 * 中保留其 * 以前的值 ,并且不在新作用域中再次初始化。[强调我的]*
1.静态变量是 * 在数据段中分配的内存,而不是堆栈段 。有关详细信息,请参阅C程序的内存布局。[强调我的]*
1.静态变量(如全局变量)如果没有显式初始化,则初始化为0。例如,在下面的程序中,x的值被打印为0,而y的值是垃圾。[参见引用程序的链接]
因此,根据定义,由于带有 * static storage duration * 的变量存在于程序的整个生命周期中,因此在运行时开始时,该内存空间中存在已知值是有意义的。(当
main()
开始运行时。)v2g6jxz62#
你所说的
static
是 static storage duration.。声明一个具有静态存储持续时间的变量实际上意味着在链接过程中,链接器将是为变量分配存储的那个。当链接器是分配存储的链接器时,这意味着变量将在
.rodata
部分(对于常量)或tec.data tec或.bss
部分中具有单个地址。每个静态变量的初始值都写入(硬编码)到可执行文件中,并在调用
main()
函数之前由加载程序简单地复制到正确的地址。这就是为什么这些变量必须用常量初始化(否则它们是零初始化的)。