1、 一次存储:静态局部变量只被初始化一次,下一次初始化根据上一次的结果值,有点类似于c++中类的静态成员变量,即无论该类型生成多少个实例对象,所有的对象共用一个静态变量,到这里就是无论这个函数调用多少次,该静态变量只初始化一次,并没有因为超出其生存期而被销毁,只是外部不可见而已,用个例子说明之:
void fun1( int v )
{
static int value = v;
static int value = v;
}
int main( int arc, char *args[ ])
{
fun1( 50 );
fun1( 100 );
}
执行的结果是:value : 50 value : 50
说明在第二次调用fun1( )时的初始化value的采用的是上一次value的值,value在静态区的存储空间并没有因为fun1( )的结束而被释放,即体现了一次存储;
2、 作用域限定:静态修饰的作用域限定功能同时体现在函数与变量上;
a) 对于函数而言,任何用static修饰的函数,其作用域仅为当前源文件,而对外部来说这个函数是不可见的,即只有和其在同一源文件中的函数才能调用这个静态函数;反过来说,如果一个函数仅仅被同一源文件中的其他函数调用,那么这个函数应该声明为静态的,这样做的好处在于:可以一定程度上的解决不同源文件之间函数的命名冲突问题;
b) 对于变量而言,static修饰的全局变量,只在当前源文件中有效,对外部不可见,外部文件不能够引用;
BUGS
The setbuffer() and setlinebuf() functions are not portable to versions
of BSD before 4.2BSD, and are available under Linux since libc 4.5.21.
On 4.2BSD and 4.3BSD systems, setbuf() always uses a suboptimal buffer
size and should be avoided.
You must make sure that the space that buf points to still exists by
the time stream is closed, which also happens at program termination.
buf是main中的局部变量,退出main后,os还会做一些清理工作
根据我的猜测,这里的清理工作就包括关闭流这些
You must make sure that the space that buf points to still exists by
the time stream is closed
main退出的时候buf不存在了,正好符合上面这句话
所以必须把buf改为全局或者static,这样buf就存放在数据区(段)了,不是在栈上