1.栈区(stack):由编译器自动分配释放,存放为运行函数而分配的局部变量、函数、参数、返回数据、返回地址等。
2.堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
3.全局区(静态区)(static):存放全局变量、静态数据、常量。
4.文字常量区:常量字符串就放在这里。
5.程序代码区:存放函数体的二进制代码。
程序运动时,程序地址空间一直存在,程序退出,地址空间释放。
从静态存储区域分配:
这块内存在程序的整个运行期间都存在,例如全局变量 static
在栈上创建:
函数内部局部变量的存储单元都可以在栈上创建,效率很高,但分配的内存容量有限。
在堆上分配:
亦称动态内存分配,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏。
运行起来的程序在退出之后,内存泄漏随即消失。
一直运行的程序——常驻进程。
const的深度理解及volatile关键字介绍
#include <stdio.h> #include <Windows.h> int main() { const int n = 10; int *p = (int*)&n; *p = 20; printf("%d\n", n); system("pause"); return 0; }
运行如上代码:
结果为20,此时 对代码进行优化:
#include <stdio.h> #include <Windows.h> int main() { volatile const int n = 10; int *p = (int*)&n; *p = 20; printf("%d\n", n); system("pause"); return 0; }
volatile作用:
编译时不优化,执行时不缓存,保证内存的可见性。
变量的初始化:
#include <stdio.h> #include <Windows.h> int fun1() { static int n = 0; n++; printf("n = %d\n", n); } int fun2() { int m = 0; m++; printf("m = %d\n", m); } int main() { int i = 0; for (; i < 10; i++){ fun1(); } for (i = 0; i < 10; i++){ fun2(); } system("pause"); return 0; }
输出的结果为:
可得出:static改变了标识符的链接属性——局部变量—>全局变量