malloc相关内容,你知道吗?

2023-11-09

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

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

malloc相关内容,你知道吗? 的相关文章

  • 如何在文件夹中的 xml 文件中 grep 一个单词

    我知道我可以使用 grep 在这样的文件夹中的所有文件中查找单词 grep rn core 但我当前的目录有很多子目录 我只想搜索当前目录及其所有子目录中存在的所有 xml 文件 我怎样才能做到这一点 我试过这个 grep rn core
  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • GCC 详细模式输出解释

    我是 Linux 新手 谁能向我解释一下我的 hello world 程序的以下详细模式输出 另外 这些文件是做什么用的crt1 o crti o crtend o crtbegin o and crtn o and lc and lgcc
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • 设置 Vim 背景颜色

    当我尝试更改背景颜色时 vimrc或者直接在 Vim 中使用以下命令 set background dark 这根本不影响我的背景 也没有light选项 不过 当我运行 gvim 时 看起来还不错 有没有办法在不更改 Konsole 设置的
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似

随机推荐

  • Java实现 LeetCode 704 二分查找(三种解法详解)

    二分查找常见三种解法详解 1 二分法 基础版 左闭右闭区间 2 二分法 改进版 左闭右开区间 3 二分法 平衡版 左闭右开区间 704 二分查找 给定一个 n 个元素有序的 升序 整型数组 nums 和一个目标值 target 写一个函数搜
  • Linux设置进程名称(标题) ( 7) -【Linux通信架构系列 】

    系列文章目录 C 技能系列 Linux通信架构系列 C 高性能优化编程系列 深入理解软件架构设计系列 高级C 并发线程编程 期待你的关注哦 现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everything is fo
  • MyBatis Generator 生成的example 使用 and or 简单混合查询

    MyBatis Generator 生成的example 使用 and or 简单混合查询 参考博客 https www cnblogs com kangping p 6001519 html 简单介绍 Example类用于构造复杂的筛选条
  • glTF格式初步了解

    glTF格式初步了解 最近看到Qt 3D的进展 偶然了解到了一种新的格式 glTF格式 这种格式据说比现有的3D格式更加符合OpenGL应用的需要 这引起了我的好奇 于是我在Qt 3D的外部链接中找到了有关glTF的相关链接 上海萌梦信息科
  • Mysql int(11)和Oracles nubmer(11) 的区别

    先说Mysql int 11 到底代表什么意思 这里的int 11 不是表示限制int的长度为11 而是字符的显示宽度 在字段类型为int时 无论你显示宽度设置为多少 int类型能存储的最大值和最小值永远都是固定的 那么这个显示宽度到底有什
  • Java中final关键字的作用

    final关键字可以用来修饰引用 方法和类 1 用来修饰一个引用 如果引用为基本数据类型 则该引用为常量 该值无法修改 如果引用为引用数据类型 比如对象 数组 则该对象 数组本身可以修改 但指向该对象或数组的地址的引用不能修改 如果引用为类
  • 开源DataX集成可视化项目Datax-Web的安装

    关于datax web项目 在做DataX项目测试的时候又收到github的推荐邮件 推荐了一个datax web的开源项目 这不是瞌睡遇到枕头 再研究研究这个项目是不是符合数据同步的要求 datax web https github co
  • JavaWeb 【基础】 servelet 异步操作

    在实际工作中我们会遇到一些耗时操作 这个时候如果不能及时response 就会返回失败 想要执行异步操作 延时返回数据 可以使用以下方法 使用asyncSupported true注解 WebServlet name apitest asy
  • Mysql基础(十二):隔离/锁/MVCC/ReadView

    目录 1 业务系统并发对数据库执行事务 2 脏写 脏读 3 不可重复读 4 幻读 5 事务隔离机制 6 MySQL如何支持4种隔离级别 Spring事务注解如何设置 7 undo log版本链是个什么东西 8 ReadView机制 多个事务
  • Java课题笔记~ Axios

    Axios 对原生的AJAX进行封装 简化书写 Axios官网是 https www axios http cn 2 1 基本使用 axios 使用是比较简单的 分为以下两步 引入 axios 的 js 文件 使用axios 发送请求 并获
  • Steam 灵感的游戏卡悬停效果

    先看效果 再看代码 查看更多
  • 【CSAPP】Binarybomb 实验(phase_1-6+secret_phase)

    Binarybomb 实验 phase 1 6 secret phase 实验内容 一个 binary bombs 二进制炸弹 下文将简称为炸弹 是一个Linux可执行C程序 包含了7个阶段 phase1 phase6和一个隐藏阶段 炸弹运
  • ROS学习笔记13--urdf文件报错:GazeboRosControlPlugin missing <legacyModeNS> while using DefaultRobotHWSim.....

    环境 ubuntn16 04 ROS kinetic vs code urdf文件运行时候报错如下 ERROR 1527494740 144219702 307 635000000 GazeboRosControlPlugin missin
  • jobdu 1 排序

    题目描述 对输入的n个数进行排序并输出 输入 输入的第一行包括一个整数n 1 lt n lt 100 接下来的一行包括n个整数 输出 可能有多组测试数据 对于每组数据 将排序后的n个整数输出 每个数后面都有一个空格 每组测试数据的结果占一行
  • MySQL存储过程与存储函数的区别

    语法定义上的区别就不说了 说一下其他的 如果有不正确的地方 还请大家指正 1 总述 存储函数和存储过程统称为存储例程 stored routine 两者的定义语法很相似 但却是不同的内容 存储函数限制比较多 比如不能用临时表 只能用表变量
  • STM32F4 DWT功能 实现程序运行时间精确测试

    时间戳相关寄存器定义 在Cortex M里面有一个外设叫DWT Data Watchpoint and Trace 该外设有一个32位的寄存器叫CYCCNT 它是一个向上的计数器 记录的是内核时钟运行的个数 最长能记录的时间为 10 74s
  • Dubbo各种协议

    原文地址 http dubbo io User Guide zh htm UserGuide zh 协议参考手册 协议参考手册 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img QStFh0Ov 166207932
  • 给定一系列正整数请按要求对数字进行分类并输出以下 5 个数字:A1=能被 5 整除的数字中所有偶数的和被5除后余1的数字按给出顺序进行交错求和被5除后余2的数字的个数被5除后余 3 的数字的平均数

    1012 数字分类 20 分 给定一系列正整数 请按要求对数字进行分类 并输出以下 5 个数字 A1 能被 5 整除的数字中所有偶数的和 A2 将被 5 除后余 1 的数字按给出顺序进行交错求和 即计算 n1 n2 n3 n4 A3 被 5
  • k8s资源控制

    文章目录 资源限定 资源限定 tomcat deploy yml apiVersion extensions v1beta1 kind Deployment metadata name tomcat deploy spec replicas
  • malloc相关内容,你知道吗?

    当一个程序经过预编译 编译 链接之后到底经历了一个怎样的过程呢 当我们写的程序内有malloc操作 那么内存到底可以申请多大呢 简单的来说下 程序首先在编译器中 经过编译之后会形成汇编格式的 o后缀的文件 经过链接之后 形成 exe的可执行