1、内存的分区(虚拟内存的分区问题)
内存:物理内存、虚拟内存。
物理内存:实实在在的存储设备。
虚拟内存:操作系统虚拟出来的内存。
操作系统会在物理内存和虚拟内存之间建立一个映射关系。
在32位系统下,每个进程的寻址范围是 4G,0x00000000 ~ 0xffffffff
在32位系统中,虚拟内存被分为两个部分,3G的用户空间和1G的内核空间,其中用户空间是当前进程所私有的,内核空间是一个系统所有的进程所公有的。
在运行程序时,操作系统会将虚拟内存中的用户空间(3G)进行分区:
(1)堆:在动态申请内存的时候,在堆里开辟内存。
(2)栈:主要存放局部变量
(3)静态全局区:1、未初始化的静态全局区:静态变量(定义变量的时候,前面加static修饰),或全局变量,没有初始化的存在此区。2、初始化的静态全局区:全局变量、静态变量、赋过初值的,存放在此区。
(4)代码区:存放程序代码
(5)文字常量区:存放常量的。
2、普通的全局变量
在函数外部定义的变量。
作用范围:程序的所有地方。不同的.c代码需要通过extern int num,进行声明。声明的时候不能够赋值。
生命周期:程序运行的整个过程,一直存在,直到程序结束。
注意:定义普通的全局变量的时候,如果不赋初值,默认为0。
3、静态全局变量(static)
定义全局变量的时候,前面用static修饰、static int num = 100;
作用范围:static限定了静态全局变量的作用范围。只能在它定义的.c文件使用。
生命周期:在程序整个运行过程中,一直存在。
注意:静态全局变量,如果不赋初值,默认为0。
4、普通的局部变量
在函数内部定义的,或复合语句中定义的变量。
作用范围:在函数中定义的变量,在当前函数中有效。在复合语句中定义的,在复合语句中才有效。
生命周期:在函数调用之前,局部变量不占用空间,调用函数的时候,才为局部变量开辟空间,函数结束了,局部变量就释放了。 在复合语句中亦是如此。
5、静态的局部变量
定义局部变量的时候,前面加static修饰。
作用范围:在它定义的函数或复合语句中有效。
生命周期:第一次调用函数的时候,开辟空间赋值,函数结束后,不释放。以后再调用函数的时候,就不再为其开辟空间,也不赋初值,用的就是以前那个变量。
6、外部函数
定义的普通函数都是外部函数,即函数可以在程序的任何一个文件中调用。
7、内部函数
内部函数也称之为静态函数。在定义的时候,返回值类型前面加static修饰。
static限定了函数的作用范围,仅在定义的.c中有效。