程序(可执行文件)存储结构与进程存储结构:

查看文件基本情况:file fileName。查看文件存储情况:size fileName(代码区text segment、全局初始化/静态数据区data segment、未初始化数据区bss、栈区stack、堆区heap)——如果有操作系统的支持,则可以不用关注;否则需要自行规划各个存储结构。

栈区:存放局部变量(不管是否初始化)和函数返回值以及参数值等、堆区:为变量分配的空间(malloc分配)全都放在堆区、BSS区:未初始化全局变量、数据区:已初始化全局变量、静态变量(未初始化放在BSS区)、常量;代码区:可执行代码。

C语言变量、函数存储类型,常见内存错误、内存管理的库函数:

C语言变量、函数存储类型:

变量声明:存储类型static+类型修饰符unsigned+数据类型int+变量名;函数声明:存储类型+返回数据类型+函数名(...)。

其中存储类型:

字符串:"\0"只是表示字符串的结束标志符,也就是说一个字符串到"\0"就结束,而"\0"后面的(包括"\0")所有字符串都不认(至少我现在发现printf是打印不出来的)。

printf的%x:以无符号十六进制形式输出整型数。

Linux可以对空指针读,但不能对空指针写(会报错:Segmentation fault (core dumped))。

堆内存泄漏:堆内存分配后,未释放或释放顺序不当(会导致程序越来越慢)。

内存管理的C语言库函数:

void *malloc(size_t size)若成功则返回分配的内存空间指针(需要强转),否则返回NULL;

void free(void *ptr)——释放后,一定要将ptr指针置空。

void *calloc(size_t num, size_t elesize)为长度为num的数组分配内存,elesize为每个元素的大小(即sizeof(类型))——若成功则返回数组首址,否则返回NULL;

void *realloc(void *exist, size_t new_size)为一个已分配内存的空间改变长度。

内存数据管理库函数:

void *memcpy(*dest,*src,n),将n个字节,从*src拷贝到*dest;成功则返回目的地址dest。

void *memmove(*dest,*src,n),和memcpy一样,都是拷贝,不一样的是该函数带内容检查?;成功则返回dest。

void *memset(*s,value,n),将指定内存区域中,前n个字节的每一个字节初始化为value;成功则返回s。

void *memchr(*s,value,n),查找指定内存区域中,前n个字节中第一个值为字符value的字节;成功找到则返回指向该字节的指针,否则返回NULL。

int memcmp(*s1,*s2,n),比较前n个字节,两个指定内存区域是否相同;相同则返回true。

伙伴算法关键元素:空闲链表+位示图+伙伴关系。

Linux—C内存管理的更多相关文章

  1. Linux堆内存管理深入分析(下)

     Linux堆内存管理深入分析 (下半部) 作者@走位,阿里聚安全 0 前言回顾 在上一篇文章中(链接见文章底部),详细介绍了堆内存管理中涉及到的基本概念以及相互关系,同时也着重介绍了堆中chunk分 ...

  2. Linux堆内存管理深入分析(上)

    Linux堆内存管理深入分析(上半部) 作者:走位@阿里聚安全   0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞 ...

  3. 深入理解Linux中内存管理

    前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...

  4. Linux堆内存管理深入分析

    (上半部) 作者:走位@阿里聚安全 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较 ...

  5. 浅谈Linux的内存管理机制

    转至:http://ixdba.blog.51cto.com/2895551/541355 一 物理内存和虚拟内存          我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此, ...

  6. Linux内核内存管理算法Buddy和Slab: /proc/meminfo、/proc/buddyinfo、/proc/slabinfo

    slabtop cat /proc/slabinfo # name <active_objs> <num_objs> <objsize> <objpersla ...

  7. Linux的内存管理

    Linux的内存管理,实际上跟windows的内存管理有很相像的地方,都是用虚拟内存这个的概念,说到这里不得不骂MS,为什么在很多时候还有很大的物理内存的时候,却还是用到了pagefile. 所以才经 ...

  8. Linux堆内存管理深入分析 (上半部)【转】

    转自:http://www.cnblogs.com/alisecurity/p/5486458.html Linux堆内存管理深入分析(上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越来 ...

  9. Linux的内存管理机制

    原文作者:技术成就梦想 链接:http://ixdba.blog.51cto.com/2895551/541355 一 物理内存和虚拟内存          我们知道,直接从物理内存读写数据要比从硬盘 ...

  10. 玩转Linux之内存管理-free

    玩转Linux之内存管理-free free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的工具中,free命令是最经常使用的命令之 ...

随机推荐

  1. 判断scrollview是否滚动到了底部

    调用函数判断如下:if(getScrollY() + getHeight() >=  computeVerticalScrollRange()){        Log.d(TAG," ...

  2. tomcat部署java servlet的3种方式

    1.将编译好的class文件按照与工程中的package的目录结构一致的文件夹底下 2.将你的servlet封装成 .war(web application archive格式的后缀名) 格式的文档直 ...

  3. 你真的了解UITextField吗?

    一:首先查看一下关于UITextField的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextField : UIControl <UITextIn ...

  4. 转大写字母-(ASCII表)

    #include<stdio.h> /* 转大写,ASCII表.大写与小写相差32 */ char upper(char c) { if(c>='a'&&c<= ...

  5. 网络&热恋NSURLConnection代理及GET¥POST请求

    1.NSURLConnection代理下载设置在本地的身骑着白马MP3 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional ...

  6. UISegmentedControl(人物简介)

    效果图 当你点击上面人物名字的时候 ,就可以随意切换人物. 这个很有趣 , 你还可以试着添加音乐播放器 .以及一些别的来完善你想做的. 好吧 , 废话不多说 , 上代码. #import " ...

  7. iOS之 HTTP、Socket、TCP的区别(易混

    一.HTTP 是一种超文本传输协议,全名hypertext transfer protocol,从字面意思上可以看出该协议用于规定客户端与服务端之间的传输规则, 传输的内容不限于文本(任意类型的数据) ...

  8. php设计模式 数据对象映射模式

    数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作.对象关系映射(Obje ...

  9. MFC MDI 主框架和标签页数据互操作

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  10. C语言链表中数组实现数据选择排序,升序、降序功能主要难点

    链表排序讲解: head指针指向链表的头结点,是找到整个链表的唯一依据,如果head指针丢失,整个链表就找不到了. head存储的是第一个节点的地址,head->next存储的是第二个节点的地址 ...