C语言中的静态变量和普通变量的区别
2016-05-17 23:18
477 查看
下面用代码说明:
一个可执行程序包括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(自动变量的值是机的,除非它被显式初始化);
静态全局变量在声明它的整个文件都是见的,而在文件之外是不可见的;
一个可执行程序包括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(自动变量的值是机的,除非它被显式初始化);
静态全局变量在声明它的整个文件都是见的,而在文件之外是不可见的;
相关文章推荐
- C++面向对象实验(五)
- C语言的指针、链表的原理和各类操作
- 2016/5/17 初识C++
- leetcode_c++:Search in Rotated Sorted Array(033)
- C++中getline函数用法(修正调试ok)
- 拓扑序列 C++实现
- 2013蓝桥决赛C/C++B组
- C++ Primer 第五版 练习 3.21,3.24
- 内存角度探寻C++面向对象 之 继承、多态
- 基于MySQL Connector/C++的数据库连接池
- C++ 运算符重载
- 单例模式-c++实现
- 库函数和系统调用
- 第8周 C语言及程序设计提高例程-31 编制自己的字符串函数
- c语言学生管理
- C语言游戏和代码
- 对Windows平台C程序内存分布研究及安全性分析
- 一起talk C栗子吧(第一百五十一回:C语言实例--socket通信地址)
- C++ string类型详解
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)