在C中,当外部变量以相同的成本服务于其目的时,静态存储类的用途是什么。两者都占用了可执行文件数据段中的存储空间。
我有更好的外部变量范围。如果我希望外部变量的范围是特定文件,我不要声明这个变量else where.i看到很多灵活性与全局变量静态局部变量
如果我们有变量的地址,我们可以引用函数外部的局部静态变量。本地静态变量的内存将在数据段中不在函数的堆栈框架中。所以静态存储类带来的独特功能到桌子。我只是想知道静态是否具有我不知道的任何微妙目的。
答案 0 :(得分:25)
你写的是全局变量具有“更好”的范围。这是不正确的。它的范围更广。更大不是更好。
如果您需要标识符可以在更多地方显示,则可能需要更大,但通常情况并非如此。但更大的范围意味着更多的错误。全局变量通过使用更难以查看它们使用和更改的程序状态而混淆了例程的语义,并且它增加了由于未能声明本地标识符和其他错误而导致错误的可能性。
特别是,具有外部链接的标识符将与其他库中的标识符冲突。考虑在编写物理应用程序时会发生什么,具有名为acceleration
的外部标识符,并链接到也具有名为acceleration
的外部标识符的物理库。该计划将失败。因此,外部标识符通常是糟糕的设计。
我们开发和维护复杂软件的能力受到严重限制是人为错误。许多编程语言语义限制语言以防止错误。使用原始计算机,您可以添加两个指针,删除堆栈指针,意外地将float
的字节加载到整数寄存器中,依此类推。良好的编程语言使得这些错误很难被误解。
在确定规则有助于控制它们之前,全局变量是更大的错误来源。优秀的程序员限制了他们的标识符的范围。
答案 1 :(得分:6)
全局变量很好,全局,可以从任何地方访问。
静态局部变量具有局部范围。它是静态的,因此它的生命周期在应用程序的生命周期中运行,但它只能从本地范围访问(无论该范围是函数,块还是文件)
答案 2 :(得分:1)
基本区别在于变量的范围。
1)全局变量是整个项目的全局变量。假设您的项目有10个不同的文件,那么所有10个文件都可以访问全局变量(请参阅如何使用extern)。
2)静态变量/函数可以由定义它的函数/文件使用。它不能被项目中的任何其他文件使用。
然而,您可以通过传递变量的引用来修改func2()中的静态变量(在func1()中定义)。请看下面的例子,
void func2(int *i)
{
(*i)++;
}
void func1()
{
static int i;
i=1;
printf("%d\n", i);
func2(&i);
printf("%d\n", i);
}
int main()
{
func1();
return 0;
}
如上所示,func1()的static int i
不能被func2()直接操作,但是如果传递变量的引用,你仍然可以像普通变量那样操作变量。
答案 3 :(得分:0)
local 和 global 之间的区别首先是范围:您只能从它们定义的块中访问局部变量,而全局变量可以是从任何地方访问。因此,在全局范围内只能有一个具有给定名称的变量,但是在不同的函数中可以有多个本地静态变量。
与静态全局变量和外部变量一样:是的,静态全局变量是转换单元的本地变量(即它们定义的.c源文件)。
因此,主要关注的是范围的概念,存储自然来自那里。
答案 4 :(得分:0)
你应该使用本地静态变量的原因是范围,因此避免了一些容易出错的情况,因为使用本地静态变量,你将无法在它定义的函数之外引用它。
答案 5 :(得分:-1)
这是一个演示差异的简短程序:
#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()
函数中没有括号,则它仅引用局部静态变量。