这两个变量在内存中的处理方式有何不同

How differently are these two variables handled in memory

我正在学习用 C 语言建模内存的方式。我知道基本上有四个不同的部分。静态内存、栈、堆和程序内存。我知道当某些东西被声明为静态时,它的生命周期(不一定是它的可见性)就是整个程序。所以假设我写了这样的东西:

#include <stdio.h>
void add();

main(){
    int i;
    for (i=0; i<6;++i){
        add();      
    }
    return 0;
}

void add(){
    static int x=5;
    x++;
    printf("The value of x is %d\n", x); 
}

程序会跟踪 x 的值直到最后一次执行。如果我这样写程序,我会得到几乎相同的结果:

#include <stdio.h>

int x=5;

add(int *num){
    (*num)++;
    printf("The value of x is %d\n", *num);
}

main(){
    int i;
    for (i=0; i<6;++i){
        add(&x);
    }
    return 0;
}

我没有使用 static 关键字,但由于它的作用,程序会在 add() 函数的连续执行中跟踪它的值。我想知道在这两种情况下, x 在内存中的处理方式是否相同。第二个 x 是否也被视为静态?

Is the second x also treated as static?

没有第二个 x 不被视为 Static。您仍然可以将第二个变量设置为静态,这会导致不同的结果。如果第二个 x 声明为 static "scope will be limited to file" 但在您的情况下它 NOT 仅限于文件。

是的,在这两种情况下 x 都存在于程序的生命周期中,但请注意使用大括号来限制范围,

第二种情况x只限于函数范围add()

void add(){  // <= From here

    static int x=5;
    x++;
    printf("The value of x is %d\n", x); 

} // <= to here

对于第二种情况 x 是全局的,也可以从其他文件访问。