0x01 简介
最近项目中需要周期行的获取某些系统的值,比如进程、MAC、IP等。像MAC等信息只要取一次就好,很少改变,全局变量可以解决问题。后来发现通过static这个关键字就可以,不需要通过全局变量。具体的代码见【测试代码】。
0x02 局部静态变量
static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用:
1、局部静态变量
在C/C++中, 局部变量按照存储形式可分为三种auto, static, register。
1.1、 存储空间分配不同
auto类型分配在栈上, 属于动态存储类别, 占动态存储区空间, 函数调用结束后自动释放, 而static分配在静态存储区, 在程序整个运行期间都不释放. 两者之间的作用域相同, 但生存期不同.
1.2、 static局部变量在所处模块在初次运行时进行初始化工作, 且只操作一次
1.3、 对于局部静态变量, 如果不赋初值, 编译期会自动赋初值0或空字符, 而auto类型的初值是不确定的. (对于C++中的class对象例外, class的对象实例如果不初始化, 则会自动调用默认构造函数, 不管是否是static类型)
1.4、register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。附录一中是一个应用。
2、外部静态变量/函数
3、静态数据成员/成员函数
0x03 测试的代码
后续将取IP的代码补充进来。
#include <stdio.h>
int test_static()
{
static int i = 0;
if (i > 0)
printf("even got i\n");
i++;
printf("i is %d\n",i);
return 0;
}
int main()
{
for (int i = 0; i < 5; i++)
test_static();
return 0;
}
编译命令:
gcc -o test test.c -std=gnu99