这两个变量在内存中的处理方式有何不同
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
是全局的,也可以从其他文件访问。
我正在学习用 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
是全局的,也可以从其他文件访问。