局部变量没有立刻释放?

该博客探讨了C语言中静态变量在函数调用过程中的行为。示例代码显示,当静态变量在函数内部使用时,它不会在每次函数调用后立即释放,而是保留其值供后续调用使用。这导致了函数f()被调用两次但结果不同的现象,揭示了静态变量在内存管理中的特性。
#include<stdio.h>
int f(int m){
	int s;
	static int k=0;
	for(;k<=m;k++){
		s++;
		printf("%d\n",k);}
	return s;
}
int main(){
	int s=1;
	s=f(2)+f(2);
	printf("%d",s);
} 

#include<stdio.h>
int f(int m){
	int s=0;
	static int k=0;
	for(;k<=m;k++){
		s++;
		printf("%d\n",k);}
	return s;
}
int main(){
	int s=1;
	s=f(2)+f(2);
	printf("%d",s);
} 

 这说明说明,第一个次f(),结束后f里面的s没有立刻释放

<think>好的,我现在需要回答用户关于STM32中不同类型变量内存布局的问题。首先,我得回忆一下STM32的内存结构,以及C语言中各种变量的存储位置。根据用户提供的引用内容,特别是引用[1]、[2]、[4],可以知道全局变量、静态变量、局部变量等的存储区域。用户的问题集中在局部变量、静态局部变量、静态全局变量、全局变量的存储位置。我需要分门别类地解释每个变量类型的位置,可能还需要提到堆栈和全局区的区别。引用[2]提到局部变量如s和b存放在栈上,而局部静态变量c在全局/静态区。引用[4]详细说明了静态全局变量和静态局部变量的作用域和存储位置。接下来,我需要确保回答的结构清晰,按照变量类型逐一说明。可能需要先概述STM32的内存分区,如栈、堆、全局/静态区等,再分别对应到不同的变量类型。同时,要注意使用正确的LaTeX格式,例如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能公式较少,主要关注变量存储区域的名称。 另外,用户提供的引用[3]提到全局变量在程序复位后、main函数之前分配,由C运行时库处理,这一点也需要在回答中提及,以解释全局变量的初始化过程。同时,要指出全局变量不占用程序存储空间,而是占用SRAM,这符合引用[3]的内容。 需要检查是否有遗漏的变量类型,比如动态分配的内存(堆),虽然用户问题中没有直接提到,但可能涉及局部指针变量如p2和p3,它们的存储位置在栈,而指向堆内存。这可能作为补充信息,但用户主要关注的是提到的四种变量类型。最后,生成相关问题需要考虑用户可能的后续疑问,例如初始化的影响、内存分配时间、优化方法等。需要确保问题与主题相关,并帮助用户深入理解。</think>### STM32变量内存布局详解 在STM32的C语言程序中,变量存储位置由作用域和存储类型共同决定。以下是主要变量类型的内存分布说明: #### 1. 局部变量 - **存储位置**:栈空间(Stack) - **特点**:函数内部定义,生命周期仅限于函数执行期间。例如: ```c void func() { int a; // 栈空间 char buf[10];// 栈空间 } ``` 栈空间由编译器自动管理,函数返回时自动释放[^2][^4]。 #### 2. 静态局部变量 - **存储位置**:全局/静态存储区(RW/ZI区) - **特点**:用`static`关键字修饰的局部变量,例如: ```c void func() { static int count = 0; // 全局/静态区 } ``` 仅初始化一次,生命周期持续到程序结束,但作用域仍限于函数内[^4]。 #### 3. 全局变量 - **存储位置**:全局/静态存储区(RW/ZI区) - **特点**:函数外部定义,例如: ```c int global_var; // 未初始化时在ZI区,初始化后在RW区 ``` 所有函数均可访问,程序启动时分配内存,main函数执行前完成初始化[^3][^4]。 #### 4. 静态全局变量 - **存储位置**:全局/静态存储区(RW/ZI区) - **特点**:用`static`修饰的全局变量,例如: ```c static int file_scope_var; // 仅当前文件可见 ``` 作用域限于定义它的文件,存储位置与普通全局变量相同[^1][^4]。 #### 内存区域对比表 | 变量类型 | 存储区 | 生命周期 | 作用域 | |----------------|-------------|----------------|----------------| | 局部变量 | 栈 | 函数执行期间 | 函数内 | | 静态局部变量 | 全局/静态区 | 程序运行期间 | 函数内 | | 全局变量 | 全局/静态区 | 程序运行期间 | 全局 | | 静态全局变量 | 全局/静态区 | 程序运行期间 | 定义它的文件内 | > **关键机制**:全局变量在程序复位后、进入main函数前由C运行时库分配内存,其大小仅影响SRAM占用,不增加程序存储空间(Flash)[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值