C之内存分类
1.分类
c语言在内存划分中分为:栈区、堆区、全局静态区、常量区、代码区。
1.栈区:在函数内部定义的局部变量和局部数组,都在栈区。栈区的空间由系统管理,调用函数时开辟空间,函数执行结束空间回收。
2.堆区,空间由开发人员手动开辟,手动回收。通过malloc开辟,free释放
3.全局静态区:存放一些全局变量和静态变量。空间由系统管理,程序开始执行开辟空间,程序运行结束空间回收,在程序执行期间一直存在(和程序的生命周期一致)。
4.常量区:存放常量,不可更改,空间由系统管理,生命周期和程序的生命周期一致。比如:字符串
5.代码区:存放代码编译之后的CPU指令,告诉计算机如何来执行程序。
下面通过一段代码,更加形象的了解内存的分类
#include <stdio.h>
#include <stdlib.h>
int a = 0; // 全局初始化区
char* p1; //全局未初始化区
int main(int argc, const char * argv[]) {
int b; //栈
char s[] = "abc"; // 栈,因为是数组,所以“abc”以数组的形式存储在栈区
char* p2; // 栈
char* p3 = "123456"; //123456在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
//分配得来得10和20字节的区域就在堆区。
p1 = (char*)malloc(10);
p2 = (char*)malloc(20);
strcpy(p1,"123456"); // 123456\0放在常量区,编译器可能会将它与p3所指向的"123456" 优化成一个地方。
return 0;
}