-
堆区(Heap) :
- 特点: 堆区是动态分配的内存空间,用于存储程序运行时动态分配的数据。在堆区分配的内存需要手动释放,否则可能导致内存泄漏。
- 分配和释放: 通过
malloc
、calloc
、realloc
等函数分配,通过free
函数释放。
-
栈区(Stack) :
- 特点: 栈区用于存储函数调用时的局部变量、函数参数和函数调用的返回地址等。它是一种后进先出(LIFO)的数据结构。
- 分配和释放: 由编译器自动分配和释放,不需要手动管理。
-
静态区(Static) :
- 特点: 静态区分为全局静态区和局部静态区。全局静态区用于存储全局变量和静态变量,而局部静态区用于存储在函数中定义的静态变量。
- 分配和释放: 由编译器分配,程序运行期间一直存在。
-
代码区(Code) :
- 特点: 代码区存储程序的执行代码。这是只读区域,存储了程序的二进制代码。
- 分配和释放: 由操作系统和加载器负责,无需手动管理。
-
带
static
关键字的全局静态变量:// 全局静态变量static int globalStaticVar = 42;int main() {// 在任何函数中都可以访问 globalStaticVar}这样定义的全局静态变量
globalStaticVar
具有文件作用域,即在整个源文件中可见,但是对其他源文件是不可见的。其他源文件中可以定义同名的全局变量,而不会产生冲突。 -
不带
static
关键字的全局静态变量:// 全局静态变量int globalStaticVar = 42;int main() {// 在任何函数中都可以访问 globalStaticVar}如果去掉
static
关键字,全局静态变量globalStaticVar
将具有全局作用域,即在整个程序中可见,包括其他源文件。这可能导致命名冲突,因为其他源文件也可以定义同名的全局变量。 -
带
static
关键字的局部静态变量:void exampleFunction() {// 局部静态变量static int localStaticVar = 42;}int main() {// localStaticVar 在这里不可见}这样定义的局部静态变量
localStaticVar
具有函数范围的作用域,即仅在定义它的函数exampleFunction
中可见。该变量的生命周期贯穿整个程序的运行时间,而不是仅在exampleFunction
被调用时存在。 -
不带
static
关键字的局部静态变量:void exampleFunction() {// 局部静态变量int localStaticVar = 42;}int main() {// localStaticVar 在这里不可见}如果去掉
static
关键字,局部静态变量localStaticVar
仍然有函数范围的作用域,但是它的生命周期将限制在exampleFunction
被调用的时期。每次调用exampleFunction
都会重新初始化这个变量。总的来说,带有
static
关键字的局部静态变量在多次函数调用之间保持其值,具有整个程序运行时间的生命周期。而不带static
关键字的局部静态变量在每次函数调用时都会重新初始化,具有函数调用的生命周期。选择取决于变量是否需要在函数调用之间保持其值。