我知道声明static
的变量仅在声明它的文件中具有作用域,而声明的没有static
的变量可以使用 extern 声明从其他文件访问。
但是"全局"static
是使变量保留最后一个分配的值,这是真的吗?喜欢静态的局部目的吗?
#include <stdio.h>
void func() {
static int x = 0; // x is initialized only once across three calls of func()
printf("%dn", x); // outputs the value of x
x = x + 1;
}
int main(int argc, char *argv[]) {
func(); // prints 0
func(); // prints 1
func(); // prints 2
return 0;
}
术语"保持最后一个值"会给您带来困惑。术语"维护最后一个值"将用于函数局部变量与函数静态变量的上下文。因为在函数中声明的变量存储在堆栈中,并且在退出函数时将被清除该函数使用的堆栈,从而使变量失效。
但是使用静态创建函数局部变量是在 RAM(而不是堆栈(中创建内存,这允许内存即使在函数退出后也能保持。甚至全局变量和文件静态变量也存储在RAM中,从而永久保留其值。
因此,对于您的问题,存储在RAM中的任何变量都将"保持其最后一个值",而不管其关键字为static。但是静态限制了它的使用范围,即,如果在文件范围内声明,那么它可以在文件中使用(访问(,如果在函数范围内声明,那么它的作用域仅限于函数。
第一次,当调用函数func时,x将被初始化为零。但是从下一次调用 func 开始,x = 0 将不会调用,因为 x 已经初始化。
示例中已将int y
添加到您的代码中y
该代码可从main()
和func()
使用(即可寻址(。
请注意,我没有在您的程序中添加任何其他代码,有些人会指出,如果实际编译y
可能会被标记为未使用。 但是对于这个讨论,main
和func
都可以设置和引用y
。
如果你可以避免使用全局变量,那就这样做,但在 C 中它们可能很有用。 K&R讨论了这一点。
希望这有帮助。
在函数的范围内,static
初始值设定项完全是关于持续时间的。变量仅在第一次调用函数时或之前初始化一次(如果代码未指定初始化值,则使用 0
、 NULL
或适当的等效项初始化变量。之后,该变量在程序运行期间继续存在。标识符的作用域仅限于函数,但变量本身继续存在,因此返回指向它的指针是有效的,否则这将是非法的。("标识符的作用域"是变量本身的名称。如果你有一个名为"gimme_a_string"的函数,并且在该函数中你static char my_str[20]
,则名称my_str
只存在于函数内部,但20字节数组始终存在。
在函数作用域("在文件作用域"(之外,您声明的任何变量的持续时间已经与程序的完整运行相同。在这种情况下,声明变量static
会影响所谓的链接。如果在文件范围内声明static int my_flags
,变量名my_flags
不能被任何其他"翻译单元"看到。程序中的任何其他源文件或任何库,如果试图通过说extern int my_flags
来获取my_flags
,都不起作用。文件中的任何函数仍然可以提供指向此变量的指针,指向调用它的任何函数,但变量名称对任何外部代码都不可见。
因此
:您的问题的答案是"不,在文件范围内,将变量声明为 static
具有使变量保留最后分配的值的效果,就像在函数作用域中一样。任何文件范围的变量都将具有该属性,声明它static
只是对其他翻译单元隐藏符号。
global static variables
具有static
初始化。只能在创建它的文件中访问它们。如果不为它们赋值,它们将被初始化为 0
。
此外,如果全局变量是在函数外部定义的,则它们的作用域从定义它们的点开始,一直持续到文件的末尾。
local static variable
是一个变量,可以在一个函数调用到另一个函数调用时保持其值,并且它将一直存在到程序结束。
#include <stdio.h>
int global_var;
static int static_var;
void func() {
static int x = 0; // x is initialized only once across three calls of func()
printf("%dn", x); // outputs the value of x
x = x + 1;
}
int main(int argc, char *argv[]) {
func(); // prints 0
func(); // prints 1
func(); // prints 2
return 0;
}
global_var
和static_var
在程序运行时的值为 0
。
当程序结束时,它们的值保持0
。
x
在func()
内,表示对象从第一次调用函数到程序结束就存在。
局部静态变量是一个变量,它可以从一个函数调用到另一个函数调用来保持其值,它将一直存在到程序结束。创建局部静态变量时,应为其分配一个初始值。如果不是,则该值将默认为 0。
全局静态变量是只能在创建它的文件中访问的变量。此变量称为具有文件范围。
静态全局和静态局部之间的区别主要是"正常"全局和"正常"局部之间的区别。您不能访问声明静态全局的函数之外的静态局部,但可以在定义静态全局的文件中的所有函数中访问静态全局。
模块静态变量和全局(外部(变量之间的主要区别在于静态局部变量存储在RAM的LI_1区域,而全局变量存储在RAM的公共区域中。因此,全局变量可以从其他模块访问,而静态变量则不能。除此之外,对于同一模块,两者的行为方式相同。两者都将初始化为零并保留该值。