今天我们继续来学习数据在内存中的存储;
C/C++程序内存的分配
一个由C/C++编译的程序占用的内存分别为一下几个部分:
1、栈区(stack)---- 由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。
2. 堆区(heap)---- 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配方式类似于链表。
3. 全局区(静态区) (static)---- 存放全局变量、静态数据、常量。程序结束后由系统释放。
4. 文字常量区 ---- 常量字符串就是放在这里的。程序结束后由系统释放。
5. 程序代码区 ---- 存放函数体 (类成员函数和全局函数)的二进制代码。
内存分配有三种方式:
1、从静态存储区域分配
内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在。例如全局变量、static变量。
2、在栈上创建
在执行函数时,函数内部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动释放。栈内存分配
运算内置于处理器的指令集中,效率高,但是分配的内容量有限。
3、从堆上分配
亦称动态内存分配
程序在运行的时候用malloc或new申请任意多少内存,
程序员自己负责在何时使用free或delete释放内存。
变量的存储位置
普通存储
运行时堆栈
硬件寄存器
变量的缺省存储类型取决于它的申明位置
1.凡是在任何代码块之外的声明的变量总是存储于静态内存中。
不属于堆栈内存,这类变量称为静态变量。讲台变量在函数运行之前创建。
2.在代码块内部声明的变量缺省存储类型是自动的。
存储于堆栈中
3.对于在代码块内部声明的变量,如果给他加上static关键字,可以是它的存储类型由自由转变为静态。
具有静态存储类型的变量在整个程序执行过程中一直存在。
注意:修改变量的存储类型并不修改变量的作用域,它只能在该代码块内部按名字访问。
4.寄存器变量:register关键字
变量的初始化:
如果不显示的初始化,静态变量的说出实话为0,二自动变量是不做任何初始化的,是随机值。
#include<stdio.h>
#include<stdlib.h>
static int m;
int fun1()
{
static int n = 0;
n++;
printf("n = %d\n", n);
}
int fun2()
{
m = 0;
m++;
printf("m = %d\n", m);
}
int main()
{
int i;
for (i = 0; i < 10; i++)
{
fun1();
}
for (i = 0; i < 10; i++)
{
fun2();
}
system("pause");
return 0;
}
static总结:
1. 当它作用于函数定义时,或者用代码块之外的变量声明时,static关键字用于修改标识符的链接属性。外部链接属性变为内部 链接属性,标识符的存储类型和作用于不变。也就是说变量或者函数只能在当前源文件中访问。不能再其他源文件中访问。
2.当它用于代码块内部时,static关键字用于修改变量的存储类型。从自动变量变为静态变量。变量的属性和作用于不受影响。
static ---- 修饰局部变量
生命周期:生命周期是整个程序的生命周期
作用域:局部作用域
存储位置:静态区
static ---- 修饰全局变量
static修饰的链接属性只能在当前源文件使用
static ---- 修饰函数
static修饰的链接属性只能在当前源文件使用