C语言中Code Area(代码区)/Static Area(静态区)/Heap(堆)/Stack(栈)的内存映射区块是什么?
o为什么要说一下这个问题!
在我完成老九学堂第80节的作业时,偶然发现了这个问题
这里提示变量的声明最大为16384字节,也就是16KB,但是系统为了安全起见,单独的局部变量一般只能使用12kb的栈空间大小。
各种内存映射区的知识
Code Area(代码区):程序代码指令、常量字符串、只可读。
Static Area(静态区):存放全局变量/常量、静态变量/常量。该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值是可以更改的。
Heap(堆):由程序员控制,使用malloc/free来操作。
Stack(栈):预先设定大小,自动分配与释放。(windows一般只提供1M空间的大小,局部变量理论同时最多放64个,所以一定要即时释放内存空间,以免栈溢出)
例子1:(func_param->函数参数)
例子2:
栈(Stack)的实现原理(windwos上除了GUI图形外,普通程序只有1M的栈区,且不可以修改)
int abc(int a,int b){ //注意:C语言的形参是从右到左入栈的,b先入栈,a后入栈;a先出栈,b后出栈
}
因为C语言是底层语言,包括操作系统本身就是用C语言写的,所以呢,很多时候是这样的:用C语言来写一个库,再用其他语言来调用。
但是呢,不能保证所有的语言都是从右到左入栈的。所以其他语言在调用C语言写的库的时候,要遵循C语言的规范。
例子3:
简单理解
我们写的代码都要经过四个步骤才能得到机器读懂的“东西”(Linux和windows)
预处理:展开头文件/宏替换/去掉注释/条件编译(输出的是.i或.ilk文件)
编译:检查语法,生成汇编(输出的是.s或.pdb文件)
汇编:汇编代码转换成机器码(输出的是.o或.obj文件)
链接:链接到一起生成可执行程序(输出的是.out或.exe文件)
两个问题:
1、那机器能够读得懂啥“东西”呢?
只有0/1的机器码,显然只能识别二进制文件。
2、二进制文件由啥构成的?
如图由栈、堆、全局数据区和代码段组成。
细讲下栈(Stack)和堆(Heap),他们两个属于动态区域
栈区(Stack):
先进后出。
由于是自动分配,速度比堆(Heap)快。
堆区(Heap):
顺序随意。
由程序员编写代码去控制分配和释放,一般放的是指针。从低往高分配。例如:test=(int*)malloc(4),要记得free,不然容易内存泄漏。
速度比较慢,而且容易产生内存碎片。
堆得具体行为,整个生命周期由程序员控制释放free。
大概说下全局数据区和代码块,了解就好,他们属于静态区域。
全局数据区Static Area:
存放全局变量和静态变量
内存又分为BSS段和数据段,简单差别如下:
BSS段:存放程序中未初始化的全局变量。
数据段:存放程序中已初始化的全局变量。
代码块(Code Area):
存放函数体的二进制代码,是由操作系统进行管理的。
在代码段中,也有可能包含一些只读的常量,例如字符串常量等。
代码段大小在程序运行之前就已经确定,并且内存区域通常属于只读,某些架构中也允许代码段为可写