Static中局部变量和全局变量有什么不同?已编译的地图文件包含这些变量的地址吗?在一个全局变量(外部变量)的描述之前,再次使用static是一个静态全局变量。一个全局变量本身是静态的,一个静态的全局变量当然也是静态的。二者在储存方法上没有差别。尽管非静态全局变量的作用域就是整个源程序,但是当一个源程序包含多个源程序时,非静态全局变量对单个源程序来说都是有效的。
同时,静态全局变量也会限制它的范围,也就是说,只有源文件定义了这个变量,并且在其他相同源程序的源文件中才可以使用。因为静态全局变量的范围仅限于一个源文件内,所以只能对那个源文件中的函数进行公共处理,这样就可以避免其他源文件产生错误。
由上述分析可以看出,在将局部变量修改成静态变量之后,存储方式就会发生变化。在将全局变量更改为静态变量之后,会改变其范围,从而限制其使范围。
static函数有别于普通函数范围。只适用于本文。目前仅用于源代码文件的函数应该被描述为internal函数(static),内部函数应在当前源文件中描述和定义。对可以在当前源文件之外使用的函数,应在一个头文件中说明,要使用这些函数的源文件包含该头部。
static全局变量和普通全局变量有何不同:static全局变量是初始化一次,并且不会被其它文件单元引用;
static本地变量与普通本地变量的不同之处是:static本地变量的初始化是一次,而下一次是基于最后一个结果的值;
static函数和普通函数有什么不同:static函数在存储器中只有一个存储器,而普通函数在每次调用时都保持一个复制程序的本地变量都位于(static),全局变量位于(静态区),而在堆中则会出现动态应用数据。extern全局变量、static全局变量和static局部变量的生存时间均为“永久”,其区别只在于可见域不同。extern全局变量的可见区是工程,static全局变量的可见区是文件,static局部变量的可视化区域是块。就代码维护的观点而言,修改extern变量可以影响所有代码,修改了static全局变量可以影响文件中的代码,修改static变量可以影响块的代码,所以当选择变量类型时,首先,static局部>static全局>extern全局。
但是这两种方法都有共同的缺点:使用这些类型变量的函数将无法重入,而线程安全。C/C++标准库中有许多函数使用static本地变量,在当前的实现中都有两组代码,单线程版本使用static变量,多线程版本使用"线程全局变量",例如rand,strtok等等。一种进程的可用内存空间是4G,可以将静态数据、代码、系统内存、堆、栈等等分开存储。ActiveRecords通常保存调用参数,返回内容,等等。heap和Stack的最大区别在于堆是从低地址到高地址分配内存,而栈是从高到低。全球和静态数据都被存储在全局数据区中,而剩下的都是由malloc或new分配的内存。通常栈的地址是低的,堆位于高地址。