一、堆内存
    1、什么是堆内存
        是进程的一个内存段(text、data、bss、stack、heap)
        由程序员手动管理
        特点是足够大,缺点是使用麻烦
    2、为什么要使用堆内存
        1.随着程序的复杂数据量多
        2.其它内存段的申请和是否不受控制,堆内存的申请释放受控制
    3、如何使用堆内存
        注意:C语言中没有任何控制堆内存的语句或者关键字,只能通过C标准库提供的函数进行使用
            #include <stdlib.h>
            void *malloc(size_t size);
                功能:从堆内存中申请size个字节数,申请成功会得到连续的内存
                返回值:成功时返回申请到的连续内存的首地址,失败时返回NULL
                注意:malloc不会专门对申请到的内存清理为零
            void free(void *ptr);
                功能:释放一段堆内存,只是释放使用权而不是清零、
                ptr:要释放的堆内存的首地址
                注意:free不能连续释放同一个地址和非法地址,不然会导致内存崩溃;但是可以free(NULL)
            void *calloc(size_t nmemb, size_t size);
                功能:从堆内存中申请nmemb个大小为size字节的一块连续内存  //总大小:nmemb*size
                返回值:成功时返回申请到的连续内存的首地址,失败时返回NULL
                注意:通过calloc会专门对申请到的内存清理为零,速度较malloc慢一些
            void *realloc(void *ptr, size_t size);
                功能:改变已有堆内存块的大小
                ptr:待调整的内存块的首地址
                size:调整后的内存块的字节数
                返回值:是调整后的内存块的首地址,有可能会改变,必须重新接受新地址(不能在原内存块基础上调整)
                    1.申请一块新的符合要求的内存块
                    2.把原内存中的内容拷贝到新内存中
                    3.释放原内存并返回新内存的首地址
        4、malloc的内存管理机制
            1.当首次向malloc申请内存时,malloc会向操作系统申请堆内存,操作系统会直接分配33页(1页=4096字节)内存给malloc管理
            2.每个内存块之间一定会有一些空隙(4~12字节),一部分空隙是为了内存对齐,其中一定有4个字节用于记录malloc的维护信息,如果维护信息被破坏,会影响下一次free的调用
           
        5、使用堆内存时需要注意的问题
            1.内存泄漏:
                内存无法使用,也无法被释放,而当再次需要时只能重新申请,重复以上过程,长期会导致系统中可用的内容越来越少
                注意:程序一旦结束,属于它的所有资源都会被操作系统回收
                *如何避免内存泄漏:
                    谁申请的谁释放,谁知道该释放谁释放
                *如何判断、定位内存泄漏:
                    a.查看内存的使用情况  //windows:任务管理器  Linux:命令ps -aux
                    b.代码分析工具mtrace,检查malloc、free的使用情况
                    c.封装新的malloc、free函数,记录调用信息到日志中    
            2.内存碎片
                已经被释放但是又无法继续使用的内存叫做内存碎片,是由于申请和释放的时间不协调导致的,无法避免只能尽量减少
                *如何减少内存碎片:
                    a.尽量使用栈内存,栈内存不会产生内存碎片
                    b.不要频繁申请和释放内存
                    c.尽量申请大块内存,自己管理
            3.内存清理函数
                #include <strings.h>
                void bzero(void *s, size_t n);
                    功能:把一块内存全部清理为零
                    s:内存块的首地址
                    n:要清理的内存字节数
                #include <string.h>
                void *memset(void *s, int c, size_t n);
                    功能:把内存块按字节设置为c
                    s:内存块的首地址
                    c:想要设置的ASCII码值
                    n:要清理的内存字节数
                    返回值:返回设置后的内存首地址 s  //链式调用:一个函数的返回值可以作为另一个函数的参数  free(memset(p,0,100));
        6、堆内存中定义二维数组
            1.指针数组:
                类型名* arr[n];
                for(int i=0; i<n; i++)
                {
                    arr[i] = malloc(size(类型)*n);
                }
                申请到 n行m列 的二维数组,每行内存不连续
                注意:每一行的m值可以不同,所以可以得到不规则的二维数组
                优点:容易申请成功
                缺点:容易产生内存碎片
            2.数组指针:
                类型名(*arrp)[m] = malloc(sizeof(类型)*n*m);
                申请到 n行m列 的二维数组,并且整体连续
                优点:不容易产生内存碎片
                缺点:相对而言对内存的要求更高
           
            注意:无论哪种方式申请,最后都是当作二维数组访问arr[i][j]

Linux & 标准C语言学习 <DAY12_2>的更多相关文章

  1. Unix和Linux下C语言学习指南

    转自:http://www.linuxdiyf.com/viewarticle.php?id=174074 Unix和Linux下C语言学习指南 引言 尽管 C 语言问世已近 30 年,但它的魅力仍未 ...

  2. linux 下C语言学习路线

    UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...

  3. UNIX/Linux下C语言的学习路线

    一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或 ...

  4. C语言学习008:标准错误

    在上一节中的数据文件中(C语言学习007:重定向标准输入和输出),如果文件中的数据包含非法数据,如何让程序显示一条错误的提示消息呢?就需要用到标准错误 #include <stdio.h> ...

  5. Linux下C语言编程基础学习记录

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

  6. 实验四 Linux系统C语言开发环境学习

    项目 内容 这个作业属于哪个课程 Linux系统与应用 这个作业的要求在哪里 作业要求链接 学号-姓名 17041428-朱槐健 作业学习目标 1.Linux系统下C语言开发环境搭建 2.学习Linu ...

  7. 【C语言学习】《C Primer Plus》第1章 概览

    学习总结 1.C语言于1972年由贝尔实验室的Dennis Ritchie在与Ken Thompson一起设计UNIX操作系统的时候开发的.的的设计构想来源于Ken Thompson的B语言.Anyw ...

  8. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  9. 郝斌老师C语言学习笔记(一)

    在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以“85”开头的很大的数字(此时该段内存中为一个垃圾数,为了避免出现较常 ...

  10. 【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

    原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年 ...

随机推荐

  1. unity读取Excel表格保存到Sqlite数据库

    1.读取Excel表格和保存sqlite数据库所用到的dll文件   下载链接:dll文件 最后如下图所示 废话不多说了,直接上代码吧 因为太长就折叠了 using System.Collection ...

  2. Authentication is required to set the network proxy

    在使用VNC访问集群的时候,总是弹出"Authentication is required to set the network proxy used for downloading pac ...

  3. Delphi中var和out

    var: 传递的是参数的地址 out: 以返回值的形式返回结果,类似函数的效果:可以实现一个函数返回多个值

  4. Flash、EEPROM、SRAM的区别与理解

    Flash.EEPROM.SRAM的区别与理解1. Flash.EEPROM.SRAM的区别(1) Flash存储器Flash适用于速度要求高.容量要求大.掉电时要求数据不丢失的场合. (2) EEP ...

  5. A Super Hero

    DP? QwQ这题似乎不能直接贪心2333-- 阶段 很明显的阶段性,\(n\)关便为\(n\)个阶段, 状态 分好阶段后,容易构造出状态的表达: \(f[i,j]\)表示Ma5termind在最开始 ...

  6. 学习Vue踩过的坑

    1.用Vue绑定方法的时候里面的methods:要加s!!! 2.v-on只有在事件监听(@click=" 方法名")和不需要参数时候才不要加 ( ),在胡子写法中{{ fun() ...

  7. IDEA 启动SpringBoot项目或Spring项目出现程序包XXX不存在

    该方法是在你的pom中的依赖(是否缺少,版本是否兼容)maven仓库等配置没有问题的情况下 第一种方法: 打开IDEA底部的终端Terminal,输入"mvn idea:idea" ...

  8. C语言——使用循环和递归计算阶乘

    使用循环和递归计算阶乘: /*使用循环和递归计算阶乘*/ #include<stdio.h> double fact(int num);//函数声明,阶乘函数,用于循环时调用 double ...

  9. div隐藏、显示

    JS隐藏和显示div的方式有两种: 需要注意的是用JS设置div的属性,必须在ccs中设置对应属性,否则报错. 同理可以设置相同class,进行批量设置. display--隐藏后释放占用的页面空间. ...

  10. c#下载蓝奏云链接文件

    控制台版本,winform更简单 static string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Des ...