静态变量存储在哪个区(变量在内存的不同区域介绍)(1)

计算机内存一般分为代码区和数据区:

数据区包括:文字常量区、静态数据区、堆区、栈区。

1、文字常量区

存放常量,如字符串常量。

char *p = "china"; //指针p指向常量区的"china"

常量区存放的数据一旦初始化就不能修改。在编译时分配,程序运行结束后由系统释放;

2、静态数据区

存放全局变量和静态变量(用static声明的变量)。初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。在编译时分配,一直保存到被新的数据覆盖或进程退出。

静态变量存储在哪个区(变量在内存的不同区域介绍)(2)

3、堆区

存放局部变量、函数参数、函数入口地址等,主要存放临时数据。由编译器分配和释放,变量的有效性会随程序运行而改变,如函数执行完后,该函数中的局部变量就被踢出栈。

4、栈区

由程序员分配管理,通过malloc申请内存,通过free释放。如果忘记释放,就会造成这片区域一直无法访问,造成内存泄漏。程序退出后,系统会自动回收。

下面通过一段代码来介绍:

静态变量存储在哪个区(变量在内存的不同区域介绍)(3)

这里需要注意的是,“free(s)” 释放的是指针变量 s 所指向的内存,而不是指针变量 s 本身。

指针变量 s 并没有被释放,仍然指向原来的存储空间,但现在指针指向的这块内存是不合法的,称为“野指针”。

因此,在释放内存后,必须把指针指向 NULL,防止指针在后面不小心又被引用了。