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

时间:2015-02-24 02:52:53

标签: c memory memory-management static

我正在学习用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是否也被视为静态?

1 个答案:

答案 0 :(得分:3)

  

第二个x是否也被视为静态?

没有第二个x不被视为Static。您仍然可以创建第二个变量Static,这会导致不同的结果。如果第二个x被声明为static,则“范围将仅限于文件”,但在您的情况下, 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是全局的,也可以从其他文件访问。