读书人

static 大局区(静态区)什么时候释放

发布时间: 2013-01-23 10:44:49 作者: rapoo

static 全局区(静态区)什么时候释放
void TestFun()
{
static struct TestStruct testStruct = {0};
//do something.
}

我在函数中用static结构体,整个程序像这样的定义非常多,而且调用频繁。
这样继续下去会出什么问题呢?
我查了资料都说static是在程序退出时才由系统回收。
如果我一直定义下去,程序会有什么问题呢?
堆栈还好理解一些。static不知道怎么理解?
希望高手一起来讨论。分数不够,再给哈。
[解决办法]
定义多了站点空间而已。。
[解决办法]
1.静态局部变量在程序开始执行的时候就始终存在,也就是说它的生命期为整个源程序。
2.静态局部变量的生命期虽然为整个源程序,但是其作用域仍与自动变量相同。
3.静态局部变量的初始化是在编译时进行的。在定义时用常量或者常量表达式进行赋值。未赋值编译时系统自动赋值为0
4.静态局部变量具有可继承性。
[解决办法]
static 变量 未初始化就放在 BSS segment ,已初始化的 就放在 Data segment

这些变量 在整个程序的生存期都存在 ,在程序结束时释放


一直定义下去,等到存不下时就直接存物理地址吧??
[解决办法]
static 变量存放在静态区,运行时大小固定


[解决办法]
crt 实现决定的, 一般在 main 之后,
在你代码中 ,, 你就假定它一直在
[解决办法]
1. static 声明的变量在整个程序退出时释放
2. 它的作用域应该是声明这个变量的CPP 或C 文件,其他文件无法使用
[解决办法]

引用:
1.静态局部变量在程序开始执行的时候就始终存在,也就是说它的生命期为整个源程序。
2.静态局部变量的生命期虽然为整个源程序,但是其作用域仍与自动变量相同。
3.静态局部变量的初始化是在编译时进行的。在定义时用常量或者常量表达式进行赋值。未赋值编译时系统自动赋值为0
4.静态局部变量具有可继承性。

++
[解决办法]
程序退出才释放。
函数内部用 static 的情况很少啊,为什么这么用?
[解决办法]
函数内部用static 有点多余吧?
[解决办法]
static 变量于整个程序生命周期内存在,程序结束,自动释放。
[解决办法]
引用:
1.静态局部变量在程序开始执行的时候就始终存在,也就是说它的生命期为整个源程序。
2.静态局部变量的生命期虽然为整个源程序,但是其作用域仍与自动变量相同。
3.静态局部变量的初始化是在编译时进行的。在定义时用常量或者常量表达式进行赋值。未赋值编译时系统自动赋值为0
4.静态局部变量具有可继承性。

++
[解决办法]
静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的分布情况如下图:

代码区

全局数据区

堆区

栈区

  一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。
[解决办法]
局部中不要这样使用。。万一其它地方变量重名了!!你就惨了!!

要学习会怎么使用静态变量。。静态变量要放在函数外边!!
[解决办法]
静态变量和extern是相反的。static只允许在本文件中使用。而extern可以再其他文件中使用。

存储在静态区。运行时空间不变。
[解决办法]
函数中的静态局部变量,在程序运行中始终存在。

除非你打算继续使用 函数中静态局部变量的值,否则无需使用静态局部变量。

对内存的影响,它是存储在静态/全局区, 不是在使用函数时才分配,函数退出时,也不会释放。
对内存的影响,它的特性就像 静态或全局变量一样。


[解决办法]
生命期为整个源程序。

[解决办法]
进程结束时释放
------解决方案--------------------


引用:
进程结束时释放


++
[解决办法]
引用:
静态变量和extern是相反的。static只允许在本文件中使用。而extern可以再其他文件中使用。

存储在静态区。运行时空间不变。


感觉 static 更像是一种封装手法。如果定义在函数内部更像是一个局部变量。这个和 extern 区别显著。

读书人网 >C语言

热点推荐