全局变量和局部变量以及静态修饰变量在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中。