首先说一下堆和栈
堆和栈都是在内存区也就是RAM区,全局变量也是在程序运行时自动存放在RAM区
int a=0; //全局初始化区 RAM
char *p1; //全局未初始化区 RAM
main()
{
int b; //栈 RAM
char s[]="abc"; //栈 RAM
char *p3= "1234567"; //在文字常量区Flash ROM
static int c =0 ; //静态初始化区 RAM
p1= (char *)malloc(10); //堆区 RAM
strcpy(p1,"123456"); //"123456"放在常量区 ROM
}
栈区是有限的 一般也特别小,主要存放程序在运行时的局部变量,如果在函数内部初始化的时候不加static那么他的数据默认就存放的栈区。由系统自动释放
堆区在物理内存存放地址上和栈区是相邻的,但堆区一般比栈区要大,他可以由用户手动分配(malloc,calloc)但必须由用户手动释放,不跑操作系统的话不释放会可能造成内存溢出,影响下一个存储区的数据导致程序出现异常,跑操作系统后操作系统会将内存回收再分配,但也可能存在溢出的可能,最好是用完释放(free)。
所以我们在写工程时候必须要注意static的使用,在函数封装时候带上static他将不会将数据放的栈区,当别人调用或者是移植你所封装的函数时将不会造成由于栈区空间不足所造成不可预知的BUG,函数的形参实际也是存放在栈区
对应的还有const修饰符,他会将数据修饰成常量,只能读取而不能改变存放在flash(ROM)中。
关于volatile修饰符可以看这个。点击打开链接