vlambda博客
学习文章列表

C语言中Code Area(代码区)/Static Area(静态区)/Heap(堆)/Stack(栈)的内存映射区块是什么?

o为什么要说一下这个问题!

在我完成老九学堂第80节的作业时,偶然发现了这个问题

这里提示变量的声明最大为16384字节,也就是16KB,但是系统为了安全起见,单独的局部变量一般只能使用12kb的栈空间大小。

C语言中Code Area(代码区)/Static Area(静态区)/Heap(堆)/Stack(栈)的内存映射区块是什么?

各种内存映射区的知识

Code Area(代码区):程序代码指令、常量字符串、只可读。

Static Area(静态区):存放全局变量/常量、静态变量/常量。该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值是可以更改的。

Heap(堆):由程序员控制,使用malloc/free来操作。

Stack(栈):预先设定大小,自动分配与释放。(windows一般只提供1M空间的大小,局部变量理论同时最多放64个,所以一定要即时释放内存空间,以免栈溢出)

C语言中Code Area(代码区)/Static Area(静态区)/Heap(堆)/Stack(栈)的内存映射区块是什么?

例子1:(func_param->函数参数)

C语言中Code Area(代码区)/Static Area(静态区)/Heap(堆)/Stack(栈)的内存映射区块是什么?

例子2:

C语言中Code Area(代码区)/Static Area(静态区)/Heap(堆)/Stack(栈)的内存映射区块是什么?

栈(Stack)的实现原理(windwos上除了GUI图形外,普通程序只有1M的栈区,且不可以修改)

C语言中Code Area(代码区)/Static Area(静态区)/Heap(堆)/Stack(栈)的内存映射区块是什么?


  
    
    
  
  • 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):

  • 存放函数体的二进制代码,是由操作系统进行管理的。

  • 在代码段中,也有可能包含一些只读的常量,例如字符串常量等。

  • 代码段大小在程序运行之前就已经确定,并且内存区域通常属于只读,某些架构中也允许代码段为可写