存储类型和static关键字作用小结

存储类型和static关键字作用

C中的存储类型分为两种,一种是静态(static),另一种是自动(automatic)。注意代码是不存在存储类型的问题,它们恒存在于静态内存中。这里所谈的存储类型,都是针对变量而言。

静态存储

将期望值放在可执行程序文件中对应的部分,然后将此文件装入内存。当程序执行时,这些对应的区域中已经存好期望的值了。

动态存储

在代码块运行时创建变量,结束后销毁。存储位置于运行时栈。

static关键字

在不同环境下具有不同的含义:

  • 用于代码块外的函数定义,或者变量声明时,static将会把链接属性从external 修改为 Internal
  • 用于代码块里的变量声明时,static将会把此变量的存储类型从automatic改为static
    • 但作用域没有改变
    • 这样声明的局部变量将在在程序中永存,而非在所在代码块调用完成时销毁,且只初始化一次。

关于第二点,我们代码演示一下:

#include <stdio.h>
#include <stdlib.h>

void foo()
{
    static int num = 0;
    printf("%d\n", num);
    num++;
}

int main()
{
    for (int i = 0; i < 5; i++)
    {
        foo();
    }
    return EXIT_SUCCESS;
}

结果会输出为“1 2 3 4 5”,也就是说,这个变量num被复用了,没有多次初始化或多次销毁。当foo执行完成时,此变量依旧存在且保留上次执行后的效果。如果删除static关键字,那么结果会输出5个0,此时的num也就成为了一个普通的局部变量,存储位置也改为了栈,变量会随foo多次的调用与结束进行多次的初始化和销毁。

你可能感兴趣的:(c,静态,static,automatic,存储类型)