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. 8-8 Ddfense Line uva1471 优先级队列

    题意:给你一串长度为n的序列   你的任务是删除一个连续的子序列  使得剩下的序列中有一个长度最大的连续递增子序列  例如  将 5 3 4 9 2 8 6 7 1 中的9 2 8 删除  得到5 3 ...

  2. WCF服务发布到IIS中去(VS2013+win7系统)

    第一个WCF程序 1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序.建立完成后如下图所示: 2.删除系统生成的两个文件IService1.cs与Service1.svc ...

  3. 这套完美的Java环境安装教程,完整,详细,清晰可观,让你一目了然,简单易懂。⊙﹏⊙

    JDK下载与安装教程 2017年06月18日 22:53:16 Danishlyy1995 阅读数:349980  版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  4. CSUOJ 1018 Avatar

    Description In the planet Pandora, Jake found an old encryption algorithm. The plaintext, key and ci ...

  5. 美团DB数据同步到数据仓库的架构与实践

    背景 在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据.在互联网企业中,常见的ODS数据有业务日志数据(Log)和业务DB数据( ...

  6. 获取Android apk的包名

    Read the package name of an Android APK aapt dump badging <path-to-apk> | grep package:\ name

  7. 关于zip伪加密

    创建一个zip文件 然后用winhex打开 可以看到第二个PK头的地方对应hex区域有一场串0000000000 在这里的第四个0这里末尾修改成奇数 奇数为加密 偶数为不加密 再去打开就可以看到加密了

  8. hdu 2197 推公式

    题意:由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串?答案mod2008.例如,100100不是本原串,因为他是由两 ...

  9. 【POJ】2796:Feel Good【单调栈】

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18449   Accepted: 5125 Case T ...

  10. Github好用的Python库使用学习日记

    开源好用的Python库 Overview 所有内容基本源于下面的两个网站 awesome-python python3官方文档 you-get(命令行操作的媒体下载工具) you-get的git项目 ...