首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我们可以以相同的成本获得全局变量时,静态局部变量还有什么用呢?

当我们可以以相同的成本获得全局变量时,静态局部变量还有什么用呢?
EN

Stack Overflow用户
提问于 2013-04-04 17:58:09
回答 6查看 28.5K关注 0票数 9

在C中,当外部变量可以以相同的代价服务于它的目的时,静态存储类又有什么用呢?两者都占用可执行文件的数据段中的存储空间。

我有更好的外部variable.If作用域,我希望外部变量的作用域是特定的文件,我不声明这个变量,否则我会看到全局变量静态局部变量的很大灵活性

我们可以在函数外部引用局部静态变量,如果我们有variable.Memory的地址,局部静态变量将在数据段中,而不是在function.So的堆栈框架中,这是静态存储类带到表中的独特功能。

我只想知道static是否有任何我不知道的微妙目的。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-04-04 18:38:29

你写的是一个全局变量有一个“更好”的作用域。这是不正确的。它有更大的范围。更大并不是更好。

如果你需要一个标识符在更多的地方可见,那么更大的可能是必要的,但通常情况并非如此。但更大的范围意味着更多的错误暴露。全局变量使它们更难看到它们使用和更改的程序状态,从而混淆了例程的语义,并增加了由于未能声明局部标识符而导致的错误和其他错误的概率。

特别是,具有外部链接的标识符将与其他库中的标识符发生冲突。考虑一下当您编写一个物理应用程序时会发生什么,拥有一个名为acceleration的外部标识符,并链接到一个也具有外部标识符acceleration的物理库。程序将失败。正因为如此,外部标识符通常是糟糕的设计。

我们开发和维护复杂软件的能力的一个重要限制是人为错误。许多编程语言语义语言进行了限制以防止错误。对于原始计算机,您可以添加两个指针、丢弃堆栈指针、意外地将float的字节加载到整数寄存器中,等等。好的编程语言使得这些错误很难被错误地处理。

在作用域规则帮助控制全局变量之前,全局变量是更大的错误来源。优秀的程序员会限制其标识符的范围。

票数 29
EN

Stack Overflow用户

发布于 2013-04-04 18:04:39

全局变量是全局的,它可以从任何地方访问。

静态局部变量具有局部作用域。它是静态的,因此它的生命周期贯穿应用程序的整个生命周期,但是它只能从本地作用域访问(无论该作用域是函数、块还是文件)

票数 7
EN

Stack Overflow用户

发布于 2013-04-04 18:08:35

基本的区别在于变量的作用域。

1)全局变量对于整个项目是全局的。假设您的项目有10个不同的文件,那么所有10个文件都可以访问全局变量(请参阅如何使用外部变量)。

2)静态变量/函数可以由定义它的函数/文件使用。它不能由项目中的任何其他文件使用。

但是,您可以通过传递变量的引用来修改func2()中的静态变量(在func1()中定义)。请看下面的例子。

代码语言:javascript
运行
复制
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()具有不能被func2()直接操作的static int i,但是如果您传递变量的引用,您仍然可以像普通变量一样操作该变量。

希望这能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15808049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档