关于static静态变量的理解以及C中的内存区的分配

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26039331/article/details/52749970

static静态变量
1、局部变量:在一个函数中,定义一个static的静态变量,它是存储在静态存储区。该变量只是在该函数第一次运行时完成初始化,若再次在调用这个函数,它不会再执行这句语句。它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

    #include <stdio.h>
    int display()
    {
        static von = 10;
        von--;
        return(von);
    }

   main()
   {
      int i;
      for(i=0;i<10;i++)
      {
         printf("\r\n%d\r\n",display());
      }
   }

这个程序的输出结果为:
9
8
7
6
5
4
3
2
1
0

2、全局变量:静态全局变量和非静态的全局变量。两种变量都是静态存储方式。          ①非静态全局变量:作用域为整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。②静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它,它不能extern到其他源文件。
3、静态函数(内部函数):在函数的返回类型前加上关键字static,函数就别定义为静态函数。函数定义和声明在默认情况下是extern的,但是静态函数只是在声明它的文件中可见,该函数的作用仅限于本.c文件。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

C中的内存区的分配
1、栈-由编译器自动分配、释放。
2、堆-由程序员分配、释放。若程序员不释放,程序结束时候有操作系统自动回收。
3、全局/静态存储区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
4、专门存放常量的区域。


//main.cpp
int a = 0;      // 全局初始化区
char *p1;      // 全局未初始化区
void main()
{
    int b;            // 栈区
    char s[] = "abc"; // 栈区
    char *p2; // 栈区
    char *p3 = "123456"; // p3在栈区;   "123456\0" 在常量区, 

    static int c =0;      // 全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在堆区 
    strcpy(p1, "123456");    // "123456\0" 放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
} 

引用: http://www.cnblogs.com/JCSU/articles/1051579.html

猜你喜欢

转载自blog.csdn.net/qq_26039331/article/details/52749970