16 动态内存分配

1.传统数组的缺点:

             ①数组长度必须事先制定,且只能是常整数,不能是变量

                           例如:

                                        int a [ 5 ] ;     //  ok

                                        int len = 5 ;int  a [ len ] ;     //error

             ②传统形式定义的数组,该数组的内存程序员无法手动释放,

                 在一个函数运行期间,系统为该函数中数组所分配的空间会

                 一直存在,直到该函数运行完毕时,数组的空间才会被系统

                 释放。

            ③数组的长度一旦定义,其长度就不能更改。

                数组的长度不能在函数运行的过程中动态的扩充或缩小

            ④A函数定义的数组,在A函数运行期间可以被其它函数使用,

                但A函数运行完毕之后,A函数中的数组无法被其他函数使用。

                传统方式定义的数组不能跨函数使用。


2.为什么需要动态分配内存:

             动态数组解决了传统数组的这四个缺陷。

            传统数组也叫静态数组

 

3.动态内存分配举例,动态数组的构造:

             malloce函数的用法;

             malloc      是    memory ( 内存 ) 和 allocate ( 分配 )  的缩写

           例如:

            #include < stdio.h >

            #malloce < stdio.h >

            int  main (void)

            {

               int  i = 5 ;      //  分配了四个字节,静态分配,11行

               int  *  p = ( int  *  ) malloce ( 4 ) ;    //  12行

                  / *

                          1.要使用malloce函数,必须添加malloce这个头文件

                          2.malloce函数只有一个形参,并且形参是整型

                          3.4表示请求系统为本程序分配四个字节

                          4.mallce只能返回第一个字节的地址

                          5.12行分配了8个字节,p变量占4个字节,p所指向的内存占4个字节

                          6.p本身所占的内存是静态分配的,p所指向的内存是动态分配的

                    * /

                *  p = 5 ;       //  * p 代表的就是一个int变量,只不过 * p这个整型变量的内存分配方式和11行的 i 变

                                         量的分配方式不同

                free ( p ) ;     // 表示把p指向的内存给释放掉,p本身的内存是静态的,,不能由程序员手动释放,

                                        p本身的内存只能在p变量所在的函数运行终止时由系统自动释放

                printf (" 同志们好!\n" );

                return 0;

              }                    


5.动态内存和静态内存呢的比较:

               静态内存是由系统自动分配,由系统自动释放,静态内存是在栈分配的。

               动态内存是由程序员手动分配的,手动释放,动态内存是堆分配的。


6.多级指针:

               #include < stdio.h >

               int  main ( void )

               {

                     int   i = 10 ;

                     int  * p = & i ;

                     int  ** q = & p ;

                     int  *** r = & q ;

                     //   r = & p ;            //error,因为r是int ***类型,r只能存放int ** 类型变量的地址

                     printf ( “ i = %d\n ” , ***r );

                     return 0 ;

                  }












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值