2010-02-16 137 views
1

gcc 4.4.2 c89在函数中声明静态变量

我一直在重新设计一些其他人的源代码。

在某个函数中,某人已经声明了一些静态变量,但似乎没有达到使它们静态的任何目的。我只是想知道下面的评论是否准确?

static char tempstr[64]; 

为了我的理解,当在一个函数内部声明静态变量时,它将保留作用域,所以像全局变量一样行为。

此外,如果静态变量在全局范围内声明,则其范围仅限于文件。

非常感谢您的任何建议,

+0

我敢打赌,函数返回tempstr。这是一种常见的绝望行为。静态关键字是非常需要的。 – 2010-02-16 04:50:33

+1

它并不总是绝望,如果你知道一个字符串将会是xx字节长,返回它的函数会受到某种形式的互斥的保护,并且调用者不需要修改返回的内容......你可以节省tickling malloc ()在循环中成千上万次(特别是当mlockall()被使用时)。但是,是的,计算优化与仅仅丢失指针的人有区别。 – 2010-02-16 09:25:50

回答

4

如果我理解你的解释,它是准确的。

函数内部静态意味着“分配数据段内存,因此该值在函数调用之间保持不变,因此所有函数实例(思考,递归或线程)共享相同的实际存储

如果在以后的函数调用中使用先前的值,或者通过外部调用或通过返回指针将引用从函数中泄漏出来,则这很重要。

2

是的,你的解释是正确的。除了要小心所谓的“像全球一样行事”。它只是在全局范围内起作用,因为它在调用之间保留了值,但它不是全局可见的,而只是在声明它的函数中。

另请参阅this question

+0

从一开始它就像一个“初始化”一样,它也“像全球化”一样。 – jamesdlin 2010-02-16 07:20:29

2

它并不是全球性的。它仍然是一个本地变量,它只是在连续调用时保持其价值。

1

这是正确的。还有一个方面要记住,如果你的代码是多线程的,所有的线程将共享同一个变量副本,所以原始设计者使用该变量作为跨线程通信机制在技术上是可行的。我不主张这种技术,但我不能在没有更多信息的情况下排除它。

+0

该应用程序不是多线程的。但是你所说的是,当一个不同的线程调用该函数时,所有线程都将保留该值。因此,如果一个线程更改了值,则另一个线程访问该函数将看到另一个线程修改的值。如果你不希望发生这种情况,这可能是一件坏事。但是,对于交叉通信,您可能希望线程读取已从另一个线程设置的值,也许可以使用修改后的值作为其他值。我在发言中是否正确? – ant2009 2010-02-16 04:53:26

+1

是的,这是正确的。我与静态局部变量的问题是,他们是“状态”。保持一致的程序状态可能是编程中最难的事情,并且当你在各地散落着小块的状态时,它会使编写正确的程序变得非常困难。我更喜欢对问题域进行建模,并创建一个非程序员领域专家认为是他/她试图解决的问题的类的层次结构。由静态局部变量表示的状态难以定位,维护和理解。 – 2010-02-16 16:13:06