全局变量和局部变量以及静态修饰变量在RAM中存放的位置

1,全局变量和全局静态变量

a、全局变量:全局变量存放在静态存储区,作用域是全局(对比下面添加static),整个声明周期都可以使用,其他文件如需要使用,需要添加extern

b、全局静态变量 (static):分配的内存与全局变量一样,也是在静态存储内存上,其生命周期也是与整个程序同在的,从程序开始到结束一直起作用,
      全局静态变量作用域只在定义它的一个源文件内,其他源文件不能使用它。(也就是其他文件也可以用同样名字的静态变量)

相同点

是由编译器自动分配和释放的,

初始化的全局变量和静态变量放在同一块内存区中

在调用main之前,内存先从FASH copy 数据(全局/静态变量),和复制全0段的(全局/静态变量)

全局变量和静态变量从0x2000,000开始存。

2,局部变量和局部静态变量

局部静态变量分配的内存也是在静态存储内存上的,其第一次初始化后就一直存在直到程序结束(只初始化一次),该变量的特点是其作用域只在定义它的函数内可见,出了该函数就不可见了。
局部 变量      分配内存是分配在栈存储区上的,其作用域也只是在局部函数内,在定义该变量的函数内,只要出了该函数,该局部变量就不再起作用,该变量的生命周期也只是和该函数同在。-----------个人理解:局部变量可以节省内存,另外在函数内运算比全局变量快,但是切换函数需要入出栈。https://blog.csdn.net/ai5945fei/article/details/88947294

3,代码举例

volatile int a = 0;  // 全局初始化区  ①存放在内存起始单元0x2000,0000  【在flash也占用空间】
volatile char *p1;   //全局未初始化区 ②存放在起始单元00x2000,0004     【在flash只占用描述空间】
void test(void)
{
    volatile  int t1=10;      //局部变量              ④存放在栈空间  0x2000,0600  【】
    volatile static int t2 =0;//局部静态变量          ③存放在起始单元0x2000,0008     
 //    printf("%d %d  ",t1,t2);//防止代码被优化
}
void main()
{
    
    volatile int b  = 0;                              //栈          ⑥存放在栈空间  0x20000620
    volatile char s[] = "abc";                        //栈          ⑤存放在栈空间  0x2000061C 
    volatile char *p2;                                //栈          存放在堆空间  0x20000618 
    volatile char *p3 = "123456";          //123456\0在常量区,p3在栈上。 0x20000614  
    volatile static int c =0;              //局部(静态)初始化区 ④存放在起始单元00x2000,000c
    test();
    
    //分配得来得10和20字节的区域就在堆区。
     p1 = (char *)malloc(10);
     p2 = (char *)malloc(20);
    volatile char *p4= (char *)malloc(20);  //存放在堆空间 0x20000610
    strcpy(p2, "123456");                               //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
    
    printf("%d %d %d %d  %d %d  %d ",a,s[0],&p3,c,p1,b,&p2,&p4);  //防止代码被优化
}

总结

概念

.bss段

    存放没有初始化或者初始化为0的全局变量或者静态局部变量。

.data段

    存放初始化为非0,且非const属性的全局变量或者静态局部变量。

.rodata段

    存放字符串和const常量,一般只放在ROM中。

posted @   流水江湖  阅读(1762)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2022-05-11 FFT之频率与幅值为何要除以(N/2)
2022-05-11 STM32 FFT相关知识
2022-05-11 STM32官方DSP库+FFT测试程序
2022-05-11 ADC采集正弦波相位问题
2022-05-11 STM32 ADC
点击右上角即可分享
微信分享提示