A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Dariel 中级黑马   /  2015-5-28 10:21  /  1847 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Dariel 于 2015-5-28 10:19 编辑

传统数组有着如下缺点:
  • 数组的长度必须事先确定,而且只能是常整数,不能是变量
    1. int a[5];//正确
    2. int len = 5; int a[len];//错误
    复制代码

  • 传统形式定义的数组,该数组的内存程序员无法手动释放,在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放。
  • 数组的长度一旦定义,其长度就不能更改,数组的长度不能在函数运行的过程中动态的扩充或缩小。
  • A函数定义的数组,在A函数运行期间可以被其它函数使用,但A函数运行完毕之后,A函数中的数组将无法被其他函数使用。也就是说,传统方式定义的数组不能跨函数使用。
   
而动态内存分配就很好解决了传统数组的这4个缺陷,传统数组也叫静态数组。

动态数组的构造        假设动态构造一个int型一维数组
  1. int *p=(int*)malloc(int len);
复制代码

  • 本句中分配了两块内存,一块内存是动态分配的,总共len个字节,另外一块是静态分配的,并且这块内存是p变量本身所占的字节,总共4个字节。
  • malloc只有一个int型的形参,表示要求系统分配的字节数。
  • malloc函数的功能是请求系统len个字节的内存空间,如果请求分配成功,则返回第一个字节的地址,如果分配不成功,则返回NULL。malloc函数能且只能返回第一个字节的地址,所以我们需要把这个无任何实际意义的第一个字节的地址(俗称干地址)转化为一个有实际意义的地址,因此malloc前面必须加(数据类型*),表示把这个无实际意义的第一个字节的地址转化为相应类型的地址。如:
    1. int *p=(int*)malloc(50);
    复制代码

    表示将系统分配好的50个字节的第一个字节地址转化为int*型的地址,更准确的说是把第一个字节的地址转化为四个字节的地址,这样p就指向了第一个的四个字节,p+1就指向了第2个的四个字节,P+i就指向了第2个的四个字节,p+i就指向了第i+1个的4个字节。p[0]就是第一个元素,p就是第i+1个元素
    1. double *p=(double*)malloc(80);
    复制代码
    表示将系统分配好的80个字节的第一个字节的地址转化为double*型的地址,更准确的说是把第一个字节的地址转化为8个字节的地址,这样p就指向了第一个的8个字节,p+1就指向了第二个的8个字节,p+i就指向了第i+1个的8个字节。p[0]就是第一个元素,p就是第i+1个元素。
  • free(p): 表示把p所指向的内存给释放掉,p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时由系统自动释放。

静态内存和动态内存的比较:

  • 静态内存是有系统自动分配,由系统自动释放。 静态内存是在栈分配的。
  • 动态内存是由程序员手动分配,手动释放。 动态内存是在堆分配的。

8 个回复

正序浏览
总结的很棒,已收藏
回复 使用道具 举报
gamyc 中级黑马 2015-5-29 18:35:34
8#
看看,学习一下
回复 使用道具 举报
不错,可以多多分享分享
回复 使用道具 举报
总结的很棒,已收藏
回复 使用道具 举报
学习 学习!!!!!!
回复 使用道具 举报
因为计算机的储存空间有限!!
回复 使用道具 举报
顶顶顶......
回复 使用道具 举报
写的不错,很有用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马