全局变量和局部变量以及静态修饰变量在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 @ 2024-05-11 23:34  流水江湖  阅读(95)  评论(0编辑  收藏  举报