malloc相关内容,你知道吗?

来源:互联网 发布:js级联菜单 编辑:程序博客网 时间:2024/06/05 05:23

当一个程序经过预编译、编译、链接之后到底经历了一个怎样的过程呢?,,,,当我们写的程序内有malloc操作,那么内存到底可以申请多大呢?
简单的来说下:程序首先在编译器中,经过编译之后会形成汇编格式的.o后缀的文件,经过链接之后 形成.exe的可执行文件。
1. 为什么要编译?
因为我们所使用的电脑是经过这些伟大的程序员们抽象了好多层之后的结果,那么我们得抽丝剥茧的来理解它。
计算机只能识别0和1这样的最简单的数字,我们写的代码需要经过转化之后才可以为电脑CPU识别,而汇编语言是最底层最接近于0、1这种符号的,所以需要经过编译器编译之后形成汇编代码 强调一下,此时的编译并不涉及内存的问题,只是需要编译器做一些转换而已。
2. 为什么要链接?
为了分模块的编译,将一个大型的文件编译为可以分解的模块。
链接分为静态链接和动态链接
2.1. 静态链接
将源文件用到的库函数在链接阶段全部链接进去,与.o文件相结合。形成.exe可执行文件。这样的链接形成后的文件可能会有点大。
这里写图片描述
2.2. 动态链接
将所用到的库在程序运行期间链接进去,而且若是多个程序使用共同的库时,内存只有一份库资源。
这里写图片描述

这里写图片描述

  1. 程序中的malloc过程(在32位体系下的Linux系统)
    涉及操作系统知识,例如在Linux环境下运行程序时,假如有一个HellWorld.c的程序,经过过gcc编译链接之后变为了HelloWorld.exe的可执行文件
    执行时 ./HelloWorld
    在bash这个主进程之中,会形成一个子进程用来执行HelloWorld这个程序,说到进程我们又不得不唠叨几句,系统为每个进程分配4G的虚拟内存空间,内核一般为1G,用户空间为3G。敲黑板画重点,虚拟的、虚拟的,它是虚拟的,要不然辣么多程序去哪找这么大的内存。
    在./HelloWorld执行时,由系统的一个loader函数,将可执行文件中的代码和数据复制到内存,然后将控制转移到程序的开头。当然进程在执行的过程中,并不是将所有代码和数据都拷贝进去,只是在运行到需要到的内容才会加载到内存,会涉及到页面交换和程序的局部性原理,这里我们不做详细讨论。
    进入本文的主旨,代码执行到malloc的时候多大才合适,或者不会因为太大而申请不到呢?前边我们说过malloc在程序之内申请的也是虚拟的,直到给它赋值或者初始化时才会在物理内存中分配。

循环申请堆中的空间。
对于size_t大家一种有种错误的认识,认为它就是unsigned int ,对于32位是没毛病的,但是对于64位的其实有一些有意思的事情,大家可以百度下。

#include<stdio.h>#include<stdlib.h>size_t maximum=0;int main(int argc,char *argv[]){       void * block;       void * tmpblock;        int i,count;    size_t blocksize[]={1024*1024, 1024, 1};        for(i=0;i<3;i++)    {               for(count=1;;count++)        {            block =malloc(maximum+blocksize[i]*count);                      if(block)            {                tmpblock = block;                           }else            {                               break;                      }               }       }       printf("the address is %x\n",tmpblock); printf("the address end is %x\n", tmpblock + maximum);  

运行结果:
这里写图片描述


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 月经来两个星期怎么办 ipad停用15分钟怎么办 苹果6id停用怎么办 ipad密码停用了怎么办 ipad永久停用了怎么办 ipad停用1小时怎么办 ipad停用无法关机怎么办 citizen手表坏了怎么办 服务器磁盘满了怎么办 百度地图定位不准怎么办 宝宝准生证丢了怎么办 fgo刷不到材料怎么办 行者轨迹未上传怎么办? 房贷少了几块钱怎么办 房贷少了2块怎么办 天天在我们家蹭饭怎么办? 亲戚天天来吃饭怎么办 cad找不到图了怎么办 新建没有工作表怎么办 Html打开是乱码怎么办 xp只读取消不了怎么办 手机地图信号弱怎么办 苹果定位不准确怎么办 苹果导航卡死怎么办 没有上传的发票怎么办 发票显示未上传怎么办 发票未上传怎么办 影响 公务员国考补录不合格的怎么办 车辆转入退档怎么办 校园网总是断网怎么办 校园网经常断网怎么办 身份证号姓名电话号码泄露怎么办 中国邮政银行短信通知怎么办 中通递送不到怎么办 智齿碎了一半怎么办 驾照扣50分怎么办 办不了租赁合同怎么办 收到佰仟律师函怎么办 佰仟律师打电话怎么办 右转车道右方路禁行怎么办 收费站没带现金怎么办