在C语言中,当一个外部变量可以以相同的代价达到其目的时,静态存储类的用途是什么?两者都占用可执行文件数据段的存储空间。
我有更好的作用域与外部变量。如果我想要外部变量的范围是特定的文件,我不声明这个变量,否则。我看到全局变量比静态局部变量
更灵活如果知道局部静态变量的地址,则可以在函数外部引用该变量。局部静态变量的内存将在数据段中,而不是在函数的堆栈帧中。静态存储类的独特之处在于:我只是想知道static是否有我不知道的微妙目的。
您写全局变量具有"更好的"作用域。这是不正确的。它的范围更大。不是越大越好
如果需要标识符在更多地方可见,则可能需要更大的,但通常情况并非如此。但是更大的范围意味着更多的错误。全局变量使例程的语义变得混乱,因为很难看到它们使用和改变的程序状态,并且它增加了由于未能声明局部标识符和其他错误而导致的错误的可能性。
特别是,具有外部链接的标识符将与其他库中的标识符发生冲突。考虑一下,当您正在编写一个物理应用程序,有一个名为acceleration
的外部标识符,并链接到一个也有一个名为acceleration
的外部标识符的物理库时,会发生什么情况。程序将失败。因此,外部标识符通常是糟糕的设计。
对我们开发和维护复杂软件的能力的一个重要限制是人为错误。许多编程语言语义限制语言以防止错误。对于原始计算机,您可以添加两个指针,丢弃堆栈指针,意外地将float
的字节加载到整数寄存器中,等等。好的编程语言使这些错误很难被错误所犯。
在作用域规则帮助控制全局变量之前,全局变量是更大的错误来源。优秀的程序员会限制标识符的作用域。
全局变量是全局的,它可以从任何地方访问。
静态局部变量具有局部作用域。它是静态的,所以它的生命周期贯穿整个应用程序的生命周期,但是它只能从局部作用域访问(无论该作用域是函数、块还是文件)
最基本的区别在于变量的作用域。
1)全局变量对于整个项目是全局的。假设你的项目有10个不同的文件,那么这10个文件都可以访问全局变量(参见如何使用extern)。
2)静态变量/函数可以被定义它的函数/文件使用。它不能被项目中的任何其他文件使用。
然而,您可以通过传递变量的引用来修改func2()中的静态变量(在func1()中定义)。请看下面的例子:
void func2(int *i)
{
(*i)++;
}
void func1()
{
static int i;
i=1;
printf("%dn", i);
func2(&i);
printf("%dn", i);
}
int main()
{
func1();
return 0;
}
正如你在上面看到的,func1()有不能被func2()直接操作的static int i
,但是如果你传递变量的引用,你仍然可以像普通变量一样操作该变量。
local和global的区别首先是作用域:你只能在定义局部变量的块内访问它们,而全局变量可以在任何地方访问。因此,在全局作用域中只能有一个给定名称的变量,但是在不同的函数中可以有多个局部静态变量。
与静态全局变量和外部变量一样:是的,静态全局变量是翻译单元的局部变量(即定义它们的。c源文件)。
所以这里主要关注的是作用域的概念,存储自然是从那里来的。
应该使用局部静态变量的原因是作用域,因此可以避免一些容易出错的情况,因为使用局部静态变量,您将无法在定义它的函数之外引用它。
这里有一个简短的程序来演示它们的区别:
#include <stdio.h>
static int a=20;
void local()
{
printf("%d,addr:%d n", a, (void*)&a);
a = 100;
}
int main()
{
{
static int a = 10;
printf("%d,addr:%d n", a, (void*)&a);
local();
}
printf("%d addr:%d n", a, (void*)&a);
}
输出:10,addr:134518604 -- local static inside the braces
20,addr:134518600 -- this is referring the global static variable
100 addr:134518600 -- This is referring the global static variable which is outside of
the braces.
这里花括号也很重要:如果main()
函数中没有花括号,那么它只引用局部静态变量。