一个程序的运行起来后,其在内存中有5个区域
1. 程序代码区
这个很简单,代码要执行,确定要加载进内存, 咱们没必要关心。
2. 文字常量区
通常咱们这样定义一个字符串时,其是在文字常量区的:
char* s1 = "hello, world";
char* s2 = "hello, world";
if(s1 == s2)
printf("s1和s2指向同一个在文字常量区的字符串");
这里, s1和s2指向的是同一个字符串
3. 静态存储区(不会释放,只到程序结束)
全局变量,静态变量会放在这个区域,事实上,全局变量也是静态的。
以上1,2,3三个区域的内存在程序起来的时候就开辟好了的。
4. 栈(}结束被自动释放)
局部变量就是在栈里的。另外,函数调用时的参数也是在栈里的,这个如今没必要关心
5. 堆(没有被手动销毁,他一直存在,直到程序结束. )
malloc或new出来的内存就是在堆里的,须要程序员本身管理清除。
//1.栈区:特性先进后出(后进先出)
//栈的特性
/*
int a=10;//1
int b=10;//2
int c=10;//3
//建立顺序:123
//销毁顺序:321
//每个函数都有一个栈帧
test();
int f=10;
*/
//函数中的变量一旦函数执行完成.所有被销毁.
/*
char *p=test2();
printf("%s",p);
*/
//2.堆区:程序员手动分配的内存,而且须要程序员手动销毁.(有几个专门的内存函数) 特色:一旦分配无论在什么地方.没有被手动销毁,他一直存在,直到程序结束.
//3.常量区:咱们编写的程序种全部的常量都被放在常量区,直到程序结束为止
//4.静态区:1.全局变量.(全部大括号外边的变量).2.static标注的变量;
/*
for (int i=0; i<3; i++) {
static int count =0;//这句话只执行一次
//被static标注的变量会有一个初始值0;
count++;
printf("%d",count);
}
/
//5.代码区:咱们编写的代码被编译器翻译以后,存入代码区
//malloc堆内存分配
//按照字节分配
//分配好的空间,使用什么类型的指针指向它,它就是什么类型的.
/*
int *p=malloc(4);
*p=10;
printf("%d",*p);
*/
/*
charchar *s=malloc(100);
strcpy(s, "你们好,我很