我在念力上有一些关于staticauto0localVariable的信息.

我在某个地方读到,static变量只能在函数中访问,但在函数返回后它们仍然存在(保留在内存中).

不过,我也知道local个变量也有同样的作用,那有什么不同呢?

推荐答案

这里有两个不同的概念:

  • scope,它确定在哪里可以访问名称,以及
  • storage duration,它确定创建和销毁变量的时间.

Local个变量(圆滑地说,变量为block scope)只能在声明它们的代码的挡路中访问:

void f() {
    int i;
    i = 1; // OK: in scope
}
void g() {
    i = 2; // Error: not in scope
}

Global个变量(按部就班地说,变量带有file scope(在C中)或namespace scope(在C++中))在其声明之后的任何点都可以访问:

int i;
void f() {
    i = 1; // OK: in scope
}
void g() {
    i = 2; // OK: still in scope
}

(在C++中,情况更为复杂,因为名称空间可以关闭和重新打开,并且可以访问当前范围以外的范围,并且名称也可以具有类范围.但这变得非常离题.)

Automatic个变量(学究地说,是automatic storage duration个变量)是局部变量,其生存期在执行离开其作用域时结束,并在重新进入作用域时重新创建.

for (int i = 0; i < 5; ++i) {
    int n = 0;
    printf("%d ", ++n);  // prints 1 1 1 1 1  - the previous value is lost
}

Static个变量(矫揉造作地说,static storage duration个变量)的生命周期一直持续到程序结束.如果它们是局部变量,那么当执行离开它们的作用域时,它们的值仍然存在.

for (int i = 0; i < 5; ++i) {
    static int n = 0;
    printf("%d ", ++n);  // prints 1 2 3 4 5  - the value persists
}

请注意,除了静态存储持续时间外,static关键字还有各种含义.在一个全局变量或函数上,它给出internal linkage,这样就无法从其他转换单元访问它;在C++类成员上,它意味着每个类有一个实例,而不是每个对象一个.此外,在C++中,auto关键字不再意味着自动存储持续时间;它现在的意思是自动类型,从变量的初始化器推导而来.

C++相关问答推荐

C中的整字母后缀i是什么

CC crate 示例不会与C函数链接

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

是否有任何情况(特定类型/值),类型双关在所有符合标准的C实现中产生相同的行为?

从内联程序集调用Rust函数和调用约定

GLIBC:如何告诉可执行文件链接到特定版本的GLIBC

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

为什么即使在强制转换时,此代码也会溢出?

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

无法在OpenGL上绘制三角形

这个空指针类型的转换是有效代码还是恶意代码?

使用正则表达式获取字符串中标记的开始和结束

问题:C#Define上的初始值设定项元素不是常量

为什么会出现此错误?二进制表达式的操作数无效

C中的char**v*char[]

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

程序如何解释变量中的值

在C中打印指针本身

计算时出现奇怪的计算错误;N Select K;在C中

malloc 属性不带参数