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

int main()
{
int stack_a;
int stack_b;
static int static_c;
static int static_d;
int *heap_e;
int *heap_f;
heap_e = (int *)malloc(10);
heap_f = (int *)malloc(10);
printf("The a address is %p\n",&stack_a);
printf("The b address is %p\n",&stack_b);
printf("The c address is %p\n",&static_c);
printf("The d address is %p\n",&static_d);
printf("The e address is %p\n",heap_e);
printf("The f address is %p\n",heap_f);
return 0;
}

输出log

root@ubuntu:/home/watson/test# ./a.out
The a address is 0x7ffd2d5894f0
The b address is 0x7ffd2d5894f4
The c address is 0x60104c
The d address is 0x601050
The e address is 0x23db010
The f address is 0x23db030

分析:

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

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

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

情况1

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

malloc (10) -> 10bytes内存申请
 The e address is 0xc04010
 The f address is 0xc04040
|------------------------------|.....|------------------------------|
0xc04010
                      0xc04040
中间0x30 = 48bytes,由于字节对齐,申请时需要申请30bytes,系统对malloc管理是让其在48bytes后再开辟新的内存空间。
修改如下的程序:
        printf("The e address is %p\n",heap_e);
printf("The e+1 address is %p\n",heap_e + 1);
printf("The f address is %p\n",heap_f);
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件衣服,第i件衣服的湿度为h. 在自然条件下,每件衣服每分钟都可以自然晒干A点湿度. 在烘干机作用下,可以选择一件衣服,用一分钟的时间晒干 ...

  2. 2020年的第一天-我的IDEA出现This license ... has been cancelled

    IDEA激活在1月3日的早上,激活码被取消了.提示:This license ... has been cancelled. 经过查询.解决方法教程无非是. ¥%--&*(激活码... 210 ...

  3. 创建jsp页面出现The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path错误

    原因未添加tomcat服务器 第一步: 第二步:

  4. Nginx 配置apple-app-site-association

    ios突然给我发了如上链接和一个json,说他那边需要放一个 apple-app-site-association 文件用来支持他那边的功能,文件不需要后缀. 先说一下要求:线上官网的地址后面跟上他所 ...

  5. 认识 LLVM

    简介 LLVM是一套提供编译器基础设施的开源项目,是用 C++ 编写,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端.它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期. ...

  6. 『无为则无心』Python面向对象 — 57、类属性和实例属性

    目录 1.类属性 (1)类属性的访问 (2)修改类属性 2.类属性和实例属性区别 1.类属性 (1)类属性的访问 类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有. 类属性可以使用 ...

  7. C语言中sizeof()的用法

    语法 sizeof有三种语法形式: 1.sizeof(object); //sizeof(对象); 2.sizeof(type_name); //sizeof(类型); 3.sizeof object ...

  8. shell脚本实现文件的自动上传以及下载 scp sftp lftp 还有expect命令

    转至: 最近需求要求定期从一个[定期更新的文件] 中解析员工信息 ,插入到数据库中. 按理来说很简单,  无非就是io流读文件,然后crud balalalala..... 其实不是的, 我我写的这个 ...

  9. OS模块的补充使用---执行终端命令

    Python基础至os模块 由于近期的项目需要用到对应的终端命令去调用其他程序,因此温习一下os.system()函数: 参考文献:https://zhuanlan.zhihu.com/p/51716 ...

  10. JZ-061-序列化二叉树

    序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存. 序 ...