计算机内存一般分为代码区和数据区:
- 代码区:存放程序代码
- 数据区:存放程序编译和运行过程中的常量和变量。
数据区包括:文字常量区、静态数据区、堆区、栈区。
1、文字常量区
存放常量,如字符串常量。
char *p = "china"; //指针p指向常量区的"china"
常量区存放的数据一旦初始化就不能修改。在编译时分配,程序运行结束后由系统释放;
2、静态数据区
存放全局变量和静态变量(用static声明的变量)。初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。在编译时分配,一直保存到被新的数据覆盖或进程退出。
3、堆区
存放局部变量、函数参数、函数入口地址等,主要存放临时数据。由编译器分配和释放,变量的有效性会随程序运行而改变,如函数执行完后,该函数中的局部变量就被踢出栈。
4、栈区
由程序员分配管理,通过malloc申请内存,通过free释放。如果忘记释放,就会造成这片区域一直无法访问,造成内存泄漏。程序退出后,系统会自动回收。
下面通过一段代码来介绍:
这里需要注意的是,“free(s)” 释放的是指针变量 s 所指向的内存,而不是指针变量 s 本身。
指针变量 s 并没有被释放,仍然指向原来的存储空间,但现在指针指向的这块内存是不合法的,称为“野指针”。
因此,在释放内存后,必须把指针指向 NULL,防止指针在后面不小心又被引用了。