malloc相关内容,你知道吗?

当一个程序经过预编译、编译、链接之后到底经历了一个怎样的过程呢?,,,,当我们写的程序内有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);  

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


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值