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. python之web框架(1):完成静态页面web服务器

    python的web框架(1) 1.首先写一个最简单的web服务器,只能给客户回应一个固定的hello world的页面. from socket import * from multiprocess ...

  2. Bootstrap进阶六:动态样式语言LESS简介

    LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承, 运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Firefox),也可以借助Node.js或者R ...

  3. web到service简单原理例子

    这是目前的理解 附上服务端源码 package com.lsw.server; import java.io.*; import java.net.*; import java.util.HashMa ...

  4. NetworkX 使用(三)

    官方教程 博客:NetworkX NetworkX 使用(二) Introduction to Graph Analysis with NetworkX %pylab inline import ne ...

  5. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

  6. Highmaps网页图表教程之数据标签与标签文本

    Highmaps网页图表教程之数据标签与标签文本 Highmaps数据标签 数据标签用于在地图图表上展现节点对应的数据.数据标签展现数据是静态的,只要节点一加载,数据标签就会出现在节点附近.在High ...

  7. Python如何将RGB图像转换为Pytho灰度图像?

    我正尝试使用matplotlib读取RGB图像并将其转换为灰度.在matlab中,我使用这个: 1 img = rgb2gray(imread('image.png')); 在matplotlib t ...

  8. 模拟Djangoweb框架

    一.需求 1.访问127.0.0.1/login,访问到login页面 2.登陆成功,跳转到登陆后的页面 3.登陆失败,跳转到登陆失败的页面 4.用户账号密码验证 二.目录结构 三.代码 day01. ...

  9. Hibernate与Mybatis对比

    Hibernate与Mybatis对比 两者相同点 Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由Ses ...

  10. [POI2015]Odwiedziny

    [POI2015]Odwiedziny 题目大意: 一棵\(n(n\le5\times10^4)\)个点的树,\(n\)次询问从一个点到另一个点的路径上,每次跳\(k\)个点,所经过的点权和. 思路: ...