static小心得

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

0x04 附录

/* Procedure for the assignment of structures, */

/* if the C compiler doesn't support this feature */

  #ifdef NOSTRUCTASSIGN

  memcpy (d, s, l)

{

register char *d;

  register char *s;

  register int i;

  while (i--)

  *d++ = *s++;

  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值