一份代码可以知道具体方式和原理:

  1. int main()
  2. {
  3. int stack_a;
  4. int stack_b;
  5. static int static_c;
  6. static int static_d;
  7. int *heap_e;
  8. int *heap_f;
  9. heap_e = (int *)malloc(10);
  10. heap_f = (int *)malloc(10);
  11. printf("The a address is %p\n",&stack_a);
  12. printf("The b address is %p\n",&stack_b);
  13. printf("The c address is %p\n",&static_c);
  14. printf("The d address is %p\n",&static_d);
  15. printf("The e address is %p\n",heap_e);
  16. printf("The f address is %p\n",heap_f);
  17. return 0;
  18. }

输出log

  1. root@ubuntu:/home/watson/test# ./a.out
  2. The a address is 0x7ffd2d5894f0
  3. The b address is 0x7ffd2d5894f4
  4. The c address is 0x60104c
  5. The d address is 0x601050
  6. The e address is 0x23db010
  7. The f address is 0x23db030

分析:

1. ab都是堆栈中的栈内存申请,因int占用四个字节,故f0 -> f4。

2. cd都是静态存储变量申请内存,在编译时已经申请分配好,不释放。

3. ef都是动态申请内存,属于堆栈的堆内存申请,此处返回一个指针。

情况1

  1. heap_e = (int *)malloc(20);
  2. heap_f = (int *)malloc(20);
  1. malloc (10) -> 10bytes内存申请
  1.  The e address is 0xc04010
     The f address is 0xc04030
    |--------------------|.....|--------------------|
  1. 0xc04010
  1.             0xc04030
  1. 中间0x20 = 32bytes,由于字节对齐,申请时需要申请20bytes,系统对malloc管理是让其在32bytes后再开辟新的内存空间。
  1. 情况2
     
  1. heap_e = (int *)malloc(30);
  2. heap_f = (int *)malloc(30);

  1. malloc (10) -> 10bytes内存申请
  1.  The e address is 0xc04010
     The f address is 0xc04040
    |------------------------------|.....|------------------------------|
  1. 0xc04010
  1.              0xc04040
  1. 中间0x30 = 48bytes,由于字节对齐,申请时需要申请30bytes,系统对malloc管理是让其在48bytes后再开辟新的内存空间。
  1. 修改如下的程序:
  1. printf("The e address is %p\n",heap_e);
  2. printf("The e+1 address is %p\n",heap_e + 1);
  3. printf("The f address is %p\n",heap_f);
  4. printf("The f-1 address is %p\n",heap_f - 1);

    The e address is 0x12fa010
    The e+1 address is 0x12fa014
    The f address is 0x12fa030
    The f-1 address is 0x12fa02c

    0x12fa014

    0x12fa02c

    前后内存地址不一致,malloc多次内存是不会连续的。



Linux C申请内存三种基本方式的更多相关文章

  1. Linux 双线策略路由的三种实现方式总结+端口映射

    Linux 双线策略路由的三种实现方式总结+端口映射 Linux 双线策略路由的三种实现方式总结+端口映射 网络环境 服务器(网关): eth0 为LAN口,IP为 LAN_IP = 192.168. ...

  2. Linux下SVN的三种备份方式

    原文链接:http://blog.csdn.net/windone0109/article/details/4040772 (本文例子基于FreeBSD/Linux实现,windows环境请自己做出相 ...

  3. 【OS_Linux】Linux中虚拟机的三种上网方式——桥接、NAT、Host-only

    1.桥接 桥接方便做实验,配置ip方便.可以和局域网中的其他机器进行通信,也可以和公网进行通信.缺点是会占用主机所在局域网的一个ip. 2. NAT NAT模式下虚拟机可以和主机进行通信,可以上网,而 ...

  4. linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用

    ---操作环境--- 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 物理机系统版本:win10  一.虚拟网络三种连接方式 当在V ...

  5. Linux基石【第二篇】虚拟网络三种连接方式(转载)

    在虚拟机上安装完Centos系统后,开始配置静态IP,以方便在本宿主机上可以访问虚拟机,在曲折的配置中,了解到虚拟机还有三种连接方式:Bridged,NAT和Host-only,于是,我又一轮新的各种 ...

  6. Linux 软件安装的三种方式

    Linux 软件安装的三种方式 1.yum ​ 语法格式: ​ yum -y install package.name ​ -y yes # 遇到提示自动输入yes ​ 案例: 安装ifconfig命 ...

  7. php 递归函数的三种实现方式

    递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去.实现递归函数可以采取什么方式呢?本文列出了三种基本方式.理解其原来需要一定的基础知识 ...

  8. IIS下PHP的三种配置方式比较

    在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异. 1. ...

  9. 垃圾回收(GC)的三种基本方式

    垃圾(Garbage)就是程序需要回收的对象,如果一个对象不在被直接或间接地引用,那么这个对象就成为了「垃圾」,它占用的内存需要及时地释放,否则就会引起「内存泄露」.有些语言需要程序员来手动释放内存( ...

随机推荐

  1. 【ybtoj】二分算法例题

    [基础算法]第三章 二分算法 例一 数列分段 题目描述 对于给定的一个长度为N的正整数数列A,现在将其分成M段,并要求每段连续,且每段和的最大值最小. 输入格式 第1行包含两个正整数N,M. 第2行包 ...

  2. C#动态规划法计算文本相似度

    C# 采用动态规划算法,计算两个字符串之间的相似程度. public static double CountTextSimilarity(string textX, string textY, boo ...

  3. MYSQL文件复制及备份

    周末研究了下mysql的数据结构,记录下: 场景1:当从一台电脑的mysql的data中复制数据库的文件夹到另一台电脑上时会发现 表不存在,函数等也不存在 方法:1.需要将data根目录下的ibdat ...

  4. 只有PC端的报表工具使用太不方便了!有没有好用的手机报表app?

    马上到年底了,签订的销售合同需尽快回款,销售经理此时正在下午出差的出租车上,通过手中的手机他查看了一下今天的回款报表 项目已经进行到了关键期,项目经理正在奔赴项目城市的高铁列车上,项目今天的进度报表已 ...

  5. C#正则表达式(通俗易懂)

    正则表达式有多重要,话不多说,直接入正题把. 首先我们来说说元字符. 1. . 点号代表除了换行意外的任意单个字符 例如 a.b  说明a和b之间只能有任意一个字符. 2.[]代表从这里面取出任意一个 ...

  6. c语言——uthash使用

    参考:https://troydhanson.github.io/uthash/userguide.html https://blog.csdn.net/lovemust/article/detail ...

  7. 【NumPy】 之常见运算(np.around、np.floor、np.ceil、np.where)(转)

    原博客链接:https://blog.csdn.net/tz_zs/article/details/80775256 np.around: 四舍五入取整 n = np.array([-0.746, 4 ...

  8. Tableau怎么制作专业图表

    Tableau怎么制作专业图表 本文首发于博客冰山一树Sankey,去博客浏览效果更好.直接右上角搜索该标题即可 一. 统计表 1.1 不同种类的图表风格 商业周刊的图表风格 经济学人的图表风格 华尔 ...

  9. linux Wireshark图解TCP三次握手与四次挥手

    Linux Wireshark图解TCP三次握手与四次挥手 原文章链接:Wireshark图解TCP三次握手与四次挥手 文章内容丰富 值得学习

  10. 微信小程序清除缓冲

    1:wxml定义一个清除缓冲的按钮,并绑定触摸事件 <button bindtap="clear">清空缓冲</button> 2:wxjs定义方法: // ...