C语言中的静态变量和普通变量的区别

来源:互联网 发布:淘宝客服全职招聘骗局 编辑:程序博客网 时间:2024/06/06 02:52

下面用代码说明:

一个可执行程序包括BSS段、数据段、代码段(文本段)

bss segment ,data segment ,code/text segment

BSS(Block by Start Symbol) :通常指用来存放程序中未初化的全局变量和静态变量的一块内存区域。BSS段属于静态内存分配

     特点是:可读写的,在程序执行之前BSS段为自动清零,所以未初始的全局变量在程序执行之前已经成零了。

数据段:通常用来存放程序中已初始化的全局变量和静态变量的一块内存区域。DATA segment 属于静态内存分配

代码段:通常是指用来存放程序代码的一块内存区域,这部分区域的大小在程序运行前就已确定,并且内存区域通常属于只读,某些架构允许代码段可写,即可以修改,在代码段中,也有可能包含一些只读的常数变量,例如字符串变量等。

堆(heap:用于存放程序中被动态分配的内存段,大小不固定,可动态扩大或缩减, malloc /free 

栈(stack:用来存放程序临时创建的局部变量,但不包括static声明的变量。除此之外,在函数被调用时,其参数也会被压入发起调用的堆栈中,并且待到调用结束后,函数的返回值也会被放会栈中,由于栈的先进后出的特点,所以栈特别方便用来保存/恢复调用现场,从这个意义来讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区

 

下面用一个代码来讲述C语言中普通变量和静态变量的存储位置

#include <stdio.h>

//全局变量

int n=3;      //已初始化的全局变量 存放在数据段
int k ;            //未初始化的全局变量  存放在bss段
static int j;      //静态全局变量 未初始化 存放在bss段
static int i=9;   //静态全局变量 初始化 存放在数据段
const int a=5;  //只读变量 存放在数据段  const修饰的不是常量而是只读的变量,const 修饰的只读变量不能用来作为定义数组的维数,也不能放在case 关键字后面。

void fun()
{
   static int ret=2;
  /*静态局部变量只会初始化一次.下一次依据上一次结果值*/
  ret++;
  printf("%d\n",ret);
}

void fun1()
{
  int ret=2;  //函数调用完就释放,所以每次调用行数ret都是从2开始
  ret++;
  printf("%d\n",ret);
}
int main(int argc, char const *argv[])
{
  printf("bss段中K,j:%d %d\n",k,j);
  int num; //局部变量存放在栈中,栈中的变量不会自动初始化为0
  static int C; //未初始化的静态局部变量存放在bss段 值为0
  printf("未定义同名前的n:%d\n",n);//3
  int n=7;
  printf("定义同名的:%d\n",n);  // 7 遵循就近原则
 

 //静态局部

//静态局部变量只会初始化一次.下一次依据上一次结果值
 fun(); //3
 fun(); //4
 fun();//5
   

 //局部
    fun1();//3
    fun1();//3
    fun1();//3
 return 0;
}

未初始化普通全局变量系统会自动初始化为0.

未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是机的,除非它被显式初始化);

静态全局变量在声明它的整个文件都是见的,而在文件之外是不可见的;

 

0 0