可以在c中动态初始化一个静态变量吗?

xsuvu9jc  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(112)

我知道静态变量必须用常量初始化,因为在程序开始运行之前,静态变量的值必须是已知的。
因此,我们可以说不可能使用动态内存分配初始化静态变量,因为这意味着变量将在程序运行时初始化。
另外,有人能解释一下为什么在main开始运行之前必须知道static变量的值吗?

y53ybaqx

y53ybaqx1#

关于你的标题问题:* 是否可以在c中动态初始化一个静态变量?答案是否定的。下面详细说明为什么……
你下一个问题的答案:

  • “因此,我们可以说,它不可能使用动态内存分配初始化一个静态变量.."*

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

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

将无法编译,因为初始化器元素不是编译时常量。
它无法编译的原因在 C标准N1570第5.1.2 段中给出,其中明确指出:
所有具有静态存储持续时间的对象应在程序启动前初始化(设置为其初始值)。
但是,动态地将内存分配给一个正确初始化的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()开始运行时。)

v2g6jxz6

v2g6jxz62#

你所说的staticstatic storage duration.
声明一个具有静态存储持续时间的变量实际上意味着在链接过程中,链接器将是为变量分配存储的那个。当链接器是分配存储的链接器时,这意味着变量将在.rodata部分(对于常量)或tec.data tec或.bss部分中具有单个地址。
每个静态变量的初始值都写入(硬编码)到可执行文件中,并在调用main()函数之前由加载程序简单地复制到正确的地址。这就是为什么这些变量必须用常量初始化(否则它们是零初始化的)。

相关问题