目录
一、全局变量和局部变量
全局变量
在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件。
局部变量
定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数其定义将被无视,在函数外使用将会报错。
两者之间的区别
作用域:
全局变量:全局变量在程序的任何地方都可以被访问,即其作用域为整个程序。它们通常在程序顶部定义,在整个程序执行期间都存在。
局部变量:局部变量只能在其所在的特定范围内被访问。例如,在函数内部定义的局部变量只能在该函数中使用,它们的作用域仅限于函数内部。
可访问性:
全局变量:全局变量在整个程序中都可以被访问,包括在函数内部。函数可以直接访问全局变量,无需任何额外声明。
局部变量:局部变量只能在其定义的作用域内被访问。其他函数或全局作用域无法直接访问局部变量。
生命周期:
全局变量:全局变量在程序开始执行时创建,直到程序结束才会被销毁。它们的生命周期与整个程序的执行周期相同。
局部变量:局部变量在其所在的作用域被创建时分配内存,并在作用域结束时自动销毁。每当函数执行时,局部变量都会被创建和销毁。
冲突风险:
全局变量:由于全局变量的可访问性较高,可能会被多个函数同时访问和修改。这可能导致变量的非预期更改和值冲突。
局部变量:局部变量只在其定义的作用域内有效,不会与其他函数或全局变量发生冲突。这增加了代码的可维护性和可靠性。
内存位置
全局变量在C中的内存位置为堆区,而局部变量位于栈区
二.堆&栈
1、STM32中的堆栈
单片机是一种集成电路芯片,集成CPU、RAM、ROM、多种I/O口和中断系统、定时器/计数器等功能。CPU中包括了各种总线电路,计算电路,逻辑电路,还有各种寄存器。
stm32 有通用寄存器 R0‐ R15 以及一些特殊功能寄存器,其中包括了堆栈指针寄存器。
当stm32正常运行程序的时候,来了一个中断,CPU就需要将寄存器中的值压栈到RAM里,然后将数据所在的地址存放在堆栈寄存器中。
等中断处理完成退出时,再将数据出栈到之前的寄存器中,这个在C语言里是自动完成的。
2、程序的内存分配
一般程序占用的内存分为以下几个部分:
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。它与数据结构中的堆是两回事,分配方式类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
//main.cpp
int a = 0; //全局初始化区
int a = 0; //全局初始化区
char *p1; //全局未初始化区