是否可以在c中动态初始化静态变量?

时间:2018-12-05 12:36:38

标签: c static dynamic-memory-allocation

我知道静态变量必须用常量初始化,因为必须在程序开始运行之前知道静态变量的值。

所以我们可以说不可能使用动态内存分配来初始化静态变量,因为这意味着该变量将在程序运行时被初始化。

还可以有人解释为什么在主程序开始运行之前必须知道静态变量的值吗?

2 个答案:

答案 0 :(得分:2)

关于标题问题:是否可以在c中动态初始化静态变量?答案是否定的。以下原因的详细信息...

下一个问题的答案:

“所以我们可以说不可能使用动态内存分配来初始化静态变量...”

是的,我们可以这样说,因为:

static int *array = calloc(5, sizeof(int)); 

将无法编译,因为初始值设定项元素不是编译时常量。

pythoncentral 中明确指出了无法编译的原因:

  

所有具有静态存储持续时间的对象均应初始化(设置为它们的   初始值)。

但是,将内存动态分配给正确初始化的static变量 是合法的:

static int *array = NULL; //properly initialized static pointer variable.
...
array = calloc(5, sizeof(int));// legal

最后一个问题的答案:为什么在main开始运行之前必须知道静态变量的值?

可以源自 C standard, N1570 paragraph 5.1.2

  

1)静态变量具有保留其值的属性,即使它们超出其范围也是如此!因此,静态变量将其 上一个值 保留在其 上一个范围 中,并且不会在新范围中再次初始化。 [强调我的]

     

2)静态变量是 在数据段中分配的内存,而不是堆栈段 。有关详细信息,请参见C程序的内存布局。 [强调我的]

     

3)如果未显式初始化静态变量(如全局变量),则初始化为0。例如,在下面的程序中,x的值显示为0,而y的值显示为垃圾。 [请参见引用程序的链接]

因此,根据定义,因为在程序的生存期内必须使用带有 These statements... 的变量来保持局部变量存在,所以在其中存在一个已知值是有道理的运行时开始时的内存空间。 (main()开始运行时。)

答案 1 :(得分:1)

您所指的static static storage duration.

声明一个具有静态存储持续时间的变量实际上意味着在链接期间,链接器将是为该变量分配存储的一个链接器。当链接器是一个分配存储时,这意味着变量将在.rodata节(用于常量)或˙.data˙或.bss节中具有单个地址。

每个静态变量的初始值都被写入(硬编码)在可执行文件中,并在调用main()函数之前由加载程序简单地复制到正确的地址。这是机制,原因是这些变量必须使用常量值初始化(否则它们将被初始化为零)。