局部变量,全局变量?探寻程序上面的栈(STACK)空间的最大值

本文通过一个简单的C语言程序展示了在Cygwin环境下堆栈空间的大小限制。该程序递归地分配局部变量,直到堆栈空间耗尽,以此来估算可用的堆栈空间大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日看到有一些与程序、内存的的资料,比较有意思。能够体现全局数据与局部变量的内存关系,我在Cygwin上面跑出来的结果是STACK 的空间只有2M,用完后程序就停止执行了,源代码如下:

filename : DepleteStackSize.c
  #include   

static long STACK_BLOCK_HEADER;  

void depleteStackSpace() {   // declare local variable for booking some STACK spaces.  

 int intVarInStackSpace = 0;   // output the memory offset  

printf("%3.1fM/n", (STACK_BLOCK_HEADER - (long)(&intVarInStackSpace)*1.0)/(1024*1024));   // self recursive   depleteStackSpace();

 

 int main() {   // the first local variable in application memory.  

 int intVarInStackSpace = 0;   // get first local variable address as the STACK block header  

STACK_BLOCK_HEADER = (long)(&intVarInStackSpace);   // perform depletion  

depleteStackSpace();   // out the normal exit message  

printf("normal exit./n"); }

 

在Cygwin中用gcc编译为Win32程序:

[root@sharkwang Temp] # gcc -mno-cygwin -o DepleteStackSize.exe DepleteStackSize.c

 

执行结果摘录如下:
2.0M
2.0M
2.0M  <--- %3.1f格式化后都四舍五入了,所以1.5xxM以上都变成2.0M了
2.0M
2.0M
2.0M
2.0M
2.0M  <--- 到最大空间后程序就停止了,没有看到Normal Exit的输出...
[root@sharkwang Temp] #

 

<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、付费专栏及课程。

余额充值