1、内存区域的划分标准:

代码段             存储代码
数据段             静态/全局数据、常量(const)     
堆区(heap)           动态内存分配(更灵活的设置容器大小存储数据)
栈区(stack)         局部变量、函数参数

2、内存分配方式的原理:静态分配和动态分配
         静态分配:编译器在处理程序源代码时分配(变量)
         动态分配:程序执行时按动态要求来分配(由程序员来决定,用完得人为释放)
         比较:静态的程序执行前分配,效率高,灵活差,对象是有名字的变量,内存分配和释放由编译器完成;动态对象没有名字的变量,通过指针间接地对它进行操作。
 
3、理解野指针的概念:
     概念:野指针不是空(NULL)指针,二是指向不属于自己的内存指针。
     三种形式:
    (1)指针变量没有被初始化。
    (2)指针p被free或者delete之后,没有将其置NULL,但是p仍然指向这块已经不属于自己的内存。
    (3)通过函数返回局部变量的地址。局部变量存放在stack栈中,函数一被执行完,在这个栈中的数据就会被释放,此时返回的指针就没有了指向,也就是函数中的那一块内存已经不属于返回的这个指针了。
 
4、内存泄露的概念:
        内存被分配后被系统记录,但是用完了,最后没有被释放,记录也就没有被删除此时内存一直被占用,即为内存泄露。类似于图书馆,好借好还。
 
5、理解malloc函数原型的含义:
     #include<stdlib.h>
        malloc 函数原型:
   void * malloc(unsigned int size); 
       通用类型指针,真正使用时,需要强制转换为要使用的类型
        说明:(1)、size这个参数的含义是分配的内存的大小(以字节为单位)
 (2)、返回值:失败,则返回值为NULL(空指针)。成功,则返回是一个 指向空类型(void)的指针,即所分配内存块的首地址。
       记住:先对返回值做判断?如果为空,分配内存失败。反之,申请成功。
 
      (1) 用malloc申请一块只保存一个整型类型的内存
                int *p = (int*)malloc(sizeof(int)
      (2) 用malloc申请一块能够保存25个整型类型的内存
                int *p = (int *)malloc(sizeof(int)*25)
 
    对动态空间的访问方式
      对单一内存的访问
      *p = 100;
      对动态数组的访问
      p[1];*(p+1);(p+1)
 
   数组存储数据时:
       *(p+i)//循环存储数据过程中,p所指向的一块内存首地址一直没有变过,变化的只是数据在这一块内存中存放的位置。测试过
       *p++;//循环存储数据中,p所指向的内存首地址一直在变化,其实,就是一块内存只是存放了一个数据,p就移动指向了另一块空间首地址,接着存下一个数据。测试过
 
6、释放内存的函数free的含义:
 
    函数原型:free (void *block)//释放的必须是malloc返回的地址
    说明:动态内存的申请和释放必须配对
 
7、注意事项:
(1)如果函数参数是一个指针,不要指望指针自己去申请动态内存。也就说指针必须指向一个有效的内存区域。
(2)指针消亡了,p=NULL并不代表它所指向的内存会被自动释放;内存被释放了,free(p)并不代表指针会消亡或者成了空指针。必须两者结合。
(3)malloc分配内存后,程序结束前必须使用free()将已分配的内存空间释放。malloc和free必须是一对一的关系,不能一对多即过度释放。
   
8、知识拓展:
  (1)使用calloc函数分配动态内存
          函数原型:void *calloc(unsigned n,unsigned size );
          作用是:在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。
          意义:用calloc函数可以为一维数组开辟动态的存储空间,n为数组元素个数,每个元素长度为size。这就是动态数组。函数返回指向所分配域的起始位置的指针;如果分配不成功,返回NULL。
          例如:
p = calloc(50,4);//开辟50*4个字节的临时分配域,把起始地址赋给指针变量p
 
     (2)使用realloc函数分配动态内存
           函数原型:void* realloc(void *p,unsigned int size);
   作用:如果已经通过malloc函数或将calloc函数获得了动态空间,想改变其大小,可以用realloc函数重新分配。
   意义:用realloc函数将p所指向的动态空间的大小改变为size。p的指向不变,如果分配不成功,返回NULL。

C语言:内存的分配与管理的更多相关文章

  1. C 语言内存区域分配(进程的各个段)详解

    C语言可执行代码结构  名称 内容 代码段  可执行代码.字符串常量 数据段  已初始化全局变量.已初始化全局静态变量.局部静态变量.常量数据 BSS段  未初始化全局变量,未初始化全局静态变量 栈 ...

  2. [转]深入C语言内存区域分配(进程的各个段)详解

    一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text).数据段(data ...

  3. 深入C语言内存区域分配(进程的各个段)详解(转)

    原文地址:http://www.jb51.net/article/39696.htm 一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务) ...

  4. java内存的分配和管理

    常用的三个内存空间 栈内存 ,堆内存 ,方法区 栈内存存储的内容: 局部变量. 函数(栈中的局部变量,需要手动赋值.当变量,或者函数执行完毕,就自动被释放) 堆内存,存储的内容 :全局变量.数据容器. ...

  5. Go语言内存管理(一)内存分配

    Go语言内存管理(一)内存分配 golang作为一种"高级语言",也提供了自己的内存管理机制.这样一方面可以简化编码的流程,降低因内存使用导致出现问题的频率(C语言使用者尤其是初学 ...

  6. 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点

    小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...

  7. Spark Tungsten揭秘 Day3 内存分配和管理内幕

    Spark Tungsten揭秘 Day3 内存分配和管理内幕 恭喜Spark2.0发布,今天会看一下2.0的源码. 今天会讲下Tungsten内存分配和管理的内幕.Tungsten想要工作,要有数据 ...

  8. C语言(记录)——内存相关_2:内存的编址与管理

    本文是基于嵌入式的C语言 --------------------------------------------------------------------------------------- ...

  9. 图解Go语言内存分配

    目录 基础概念 内存管理单元 内存管理组件 mcache mcentral mheap 内存分配流程 总结 参考资料 Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理. ...

随机推荐

  1. 使用setsid替代nohup

    使用setsid替代nohup 使用 nohup 执行sudo -e时会有问题的.

  2. 网络请求+Gson解析--Retrofit 2

    其实内部是封装了Okhttp和Gson解析 public class CourseFragmentAPI { public static void get(String userId, BaseCal ...

  3. jQuery的data() 和 h5 的 dataset()

    作用:获取自定义属性 命名规则:驼峰命名法  data-user==>user data-user-name==>userName 区别:jQuery:操作内存   h5: 操作DOM j ...

  4. 自定义JSP标签示例

    我们以一个例子来讲解如何自定义JSP标签,假如我们需要在页面中输出当前的时间,按照最简单的JSP脚本,需要在JSP里面写很多Java代码,那么如何来使用自定义标签实现这个功能呢? 首先,我们要先创建一 ...

  5. MacBook Apache服务

    想着如何在Mac OS下部署静态网页(纯粹的html,css,js),用惯了windows下的iis,可惜Mac OS下也许只能通过Tomcat或者Apache之类的作为部署容器.听说Mac OS下自 ...

  6. 安装部署VMware vSphere 5.5文档 (6-4) 安装配置DB数据库

    部署VMware vSphere 5.5 实施文档 ########################################################################## ...

  7. 渗透测试中的bypass技巧

    0x00 前言 许多朋友在渗透测试中因为遇到WAF而束手无策,本人应邀,与godkiller一同写下此文,希望能够对许多朋友的问题有所帮助. 此系列一共分为五篇文章,分别如下: 一.架构层绕过WAF ...

  8. [BZOJ3928/4048]Outer space invaders

    [BZOJ3928/4048]Outer space invaders 题目大意: 有\(n(n\le300)\)个物品,第\(i\)个物品会在\(a_i\sim b_i\)时刻出现,且离你的距离为\ ...

  9. bzoj 4627: [BeiJing2016]回转寿司 -- 权值线段树

    4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec  Memory Limit: 256 MB Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店. ...

  10. NOIP2018 RP++

    飞吧,不用看向地面. NOIP,RP++.