对象分配在堆中,指针分配在栈中。基本数据类型与结构体分配中栈中
一般认为在c中分为这几个存储区:
1栈 -- 由编译器自动分配释放。
2堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
3全局区(静态存储区)-- 全局变量和静态变量的存储是放在一块区域 ,程序退出后自动释放 。全局区又分为全局初始化区和全局未初始化区。初始化的全局变量和静态变量存放在全局初始化区,未初始化的全局变量和未初始化的静态变量存放在相邻的另一块区域。
4常量区-- 专门放数字/字符常量的地方, 程序退出后自动释放 。
在函数体中定义的自动变量通常是在栈上,
用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。
加了static修饰符后不管在哪里都存放在全局区(静态存储区)。
在所有函数体外定义的是全局变量,存储在全局区(静态存储区),在整个C程序所有源文件中通过extern声明后都可用。
在所有函数体外定义的static全局变量存储在全局区(静态存储区),只在该文件中有效,不能extern声明到别的文件用。
在函数体内定义的static静态变量存储在全局区(静态存储区),表示只在该函数体内有效,但是其生命周期却变为和整个程序同生同死。
另外,函数中的"adgfdf"这样的字符串存放在常量区。
代码:
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10); //分配得来的10 字节的区域就在堆区。
p2 = (char *)malloc(20); //分配得来的 20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}