1.概述
在C中一般分为这几个存储区:
1)
2)
3)
4)
5)
6)
2.说明
在函数体中定义的局部变量是在栈上分配的,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
比如:
int
char *p1;
void main()
{
int b;
char s[] = "abc";
char *p2;
char *p3 = "123456";
static int c =0;
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
strcpy(p1, "123456");
}
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,很多多任务的操作系统在创建任务时指定。栈不够用的情况一般是程序中分配了大量局部数组,大结构局部变量和函数调用的层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为C分配动态内存时是寻找匹配的内存的,如果系统中的内存碎片很多,尽管还有许多free的,但由于都被切碎了,没有一整块的大内寸,这样会导致分配大块內存时失败(不要过于依赖操作系统对内存碎片的整合)。在一些数据库相关的大型的软件开发过程中,需要频繁地分配释放内存,这时就需要用内存池(会增加额外的管理开销)来解决碎片问题。而用栈则不会产生碎片。