- 普通局部变量
- 定义位置与作用域:
- 普通局部变量在函数内部定义。例如:
void func() { int local_variable = 10; // 变量local_variable的作用域仅限于这个函数内部 }
- 它的作用域从定义的位置开始,到包含它的代码块(通常是函数体)结束。在这个函数之外,无法访问这个局部变量。
- 普通局部变量在函数内部定义。例如:
- 生命周期:
- 普通局部变量的生命周期是从函数被调用开始,当函数执行结束后,该变量所占用的内存空间就会被释放。例如在上面的
func
函数中,每次调用func
时,local_variable
会被创建,函数返回后就销毁。
- 普通局部变量的生命周期是从函数被调用开始,当函数执行结束后,该变量所占用的内存空间就会被释放。例如在上面的
- 存储位置:
- 普通局部变量存储在栈(stack)中。栈是一种后进先出(LIFO)的数据结构,用于存储函数调用的信息,包括局部变量、函数参数等。当函数调用时,系统会为函数的局部变量在栈上分配内存空间,函数结束后自动回收这些空间。
- 定义位置与作用域:
- 普通全局变量
- 定义位置与作用域:
- 普通全局变量在所有函数外部定义。例如:
int global_variable = 20; void func() { // 在函数func中可以访问global_variable global_variable = 30; }
- 它的作用域是从定义的位置开始,到整个源文件结束。并且在有适当声明的其他源文件(通过
extern
关键字)中也可以访问。例如,如果有另一个源文件main.c
和定义全局变量的源文件globals.c
,在main.c
中可以通过extern int global_variable;
声明后使用这个全局变量。
- 普通全局变量在所有函数外部定义。例如:
- 生命周期:
- 普通全局变量的生命周期是整个程序的运行期间。它在程序开始运行时被创建,在程序结束时才被销毁。
- 存储位置:
- 普通全局变量存储在数据段(data segment)中。数据段用于存储初始化的全局变量和静态变量,这些变量在程序运行期间占用固定的内存空间。
- 定义位置与作用域:
- 静态局部变量
- 定义位置与作用域:
- 静态局部变量在函数内部定义,通过在变量定义前加上
static
关键字来声明。例如:void func() { static int static_local_variable = 5; // 变量static_local_variable的作用域仍然是函数func内部 }
- 它的作用域和普通局部变量一样,仅限于定义它的函数内部,在函数外部无法访问。
- 静态局部变量在函数内部定义,通过在变量定义前加上
- 生命周期:
- 静态局部变量的生命周期是整个程序的运行期间。这是和普通局部变量的最大区别。第一次进入包含静态局部变量的函数时,变量被初始化,之后函数每次调用,这个变量都保持上一次调用结束时的值,而不是重新初始化。例如,在多次调用
func
函数时,static_local_variable
的值会在每次调用后保留。
- 静态局部变量的生命周期是整个程序的运行期间。这是和普通局部变量的最大区别。第一次进入包含静态局部变量的函数时,变量被初始化,之后函数每次调用,这个变量都保持上一次调用结束时的值,而不是重新初始化。例如,在多次调用
- 存储位置:
- 静态局部变量存储在数据段中。和普通全局变量类似,它在程序运行期间一直占用内存空间,直到程序结束。
- 定义位置与作用域:
- 静态全局变量
- 定义位置与作用域:
- 静态全局变量在所有函数外部定义,并且使用
static
关键字修饰。例如:static int static_global_variable = 15; void func() { // 在函数func中可以访问static_global_variable static_global_variable = 25; }
- 它的作用域仅限于定义它的源文件内部。与普通全局变量不同,其他源文件无法通过
extern
声明来访问这个静态全局变量。
- 静态全局变量在所有函数外部定义,并且使用
- 生命周期:
- 静态全局变量的生命周期是整个程序的运行期间,从程序开始运行时创建,到程序结束时销毁。
- 存储位置:
- 静态全局变量也存储在数据段中,和静态局部变量、普通全局变量一样在程序运行期间占用固定的内存空间。
- 定义位置与作用域:
这些不同类型变量的特点决定了它们在不同的编程场景中的用途。普通局部变量适合在函数内部临时存储数据,不会影响其他函数的运行;普通全局变量用于在多个函数之间共享数据,但可能会导致命名冲突等问题;静态局部变量用于在函数多次调用之间保持状态;静态全局变量用于在一个源文件内部共享数据,同时避免对其他源文件的干扰。