gpt4 book ai didi

C: C "ignore"局部函数变量在静态时如何后续初始化?

转载 作者:太空宇宙 更新时间:2023-11-04 05:54:44 24 4
gpt4 key购买 nike

(C 初学者警报)

维基百科将静态变量定义为,“...静态分配的变量——其生命周期或“范围”延伸到程序的整个运行过程。”

然后继续给出C语言的例子:

#include <stdio.h>

void func() {
static int x = 0;
/* x is initialized only once across four calls of func() and
the variable will get incremented four
times after these calls. The final value of x will be 4. */
x++;
printf("%d\n", x); // outputs the value of x
}

int main() { //int argc, char *argv[] inside the main is optional in the particular program
func(); // prints 1
func(); // prints 2
func(); // prints 3
func(); // prints 4
return 0;
}

这是我的问题:变量 x,当定义为 static 时,不会在程序的整个运行过程中保持其值。事实上,它的作用恰恰相反,即对于 func() 的任何后续调用,它都具有在先前调用中分配的值。只有当我删除 static 关键字时,无论 func() 被调用多少次,x 都会保留其 0 值。

所以:

1) 维基百科的解释是否不准确/具有误导性?如果是,您如何更好地解释静态变量的性质?

2) 在 func() 的第二次和后续调用中实际上发生了什么,以至于 x 初始化为 0 被有效地忽略了?

最佳答案

您只是误解了引用的解释。说一个变量的“生命周期”延伸到整个程序的意思是它在内存中分配一次,初始化一次,对它所做的任何更改都反射(reflect)在同一个内存位置——内存是为生命周期分配的的程序。对该函数的后续调用将在他们离开时找到该内存的内容(x 的值)。他们仍然可以更改值,但它将始终是同一 block 内存。

当您删除“static”时,您是在告诉编译器在每次调用函数时分配一个新变量“x”,将其赋值为 0,并在函数返回时将其丢弃。在下一次调用时,将创建一个完全不同的变量 X,再次赋值为 0,然后再次丢弃。因此,该变量的“生命周期”仅在函数内部。

这是一个与变量的“范围”完全不同的概念,变量的“范围”是指谁可以查看和更改变量:它的范围仍在函数内部,即使是静态的。

关于C: C "ignore"局部函数变量在静态时如何后续初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30244267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com