站長資訊網
        最全最豐富的資訊網站

        鏈表的c語言實現(一)

        準備:動態內存分配
        一、為什么用動態內存分配
        但我們未學習鏈表的時候,如果要存儲數量比較多的同類型或同結構的數據的時候,總是使用一個數組。比如說我們要存儲一個班級學生的某科分數,總是定義一個float型(存在0.5分)數組:
        float score[30];
        但是,在使用數組的時候,總有一個問題困擾著我們:數組應該有多大?
        在很多的情況下,你并不能確定要使用多大的數組,比如上例,你可能并不知道該班級的學生的人數,那么你就要把數組定義得足夠大。這樣,你的程序在運行時就申請了固定大小的你認為足夠大的內存空間。即使你知道該班級的學生數,但是如果因為某種特殊原因人數有增加或者減少,你又必須重新去修改程序,擴大數組的存儲范圍。這種分配固定大小的內存分配方法稱之為靜態內存分配。但是這種內存分配的方法存在比較嚴重的缺陷,特別是處理某些問題時:在大多數情況下會浪費大量的內存空間,在少數情況下,當你定義的數組不夠大時,可能引起下標越界錯誤,甚至導致嚴重后果。
        那么有沒有其它的方法來解決這樣的外呢體呢?有,那就是動態內存分配。
        所謂動態內存分配就是指在程序執行的過程中動態地分配或者回收存儲空間的分配內存的方法。動態內存分配不象數組等靜態內存分配方法那樣需要預先分配存儲空間,而是由系統根據程序的需要即時分配,且分配的大小就是程序要求的大小。從以上動、靜態內存分配比較可以知道動態內存分配相對于景泰內存分配的特點:
        1、不需要預先分配存儲空間;
        2、分配的空間可以根據程序的需要擴大或縮小。
        二、如何實現動態內存分配及其管理
        要實現根據程序的需要動態分配存儲空間,就必須用到以下幾個函數
        1、malloc函數
        malloc函數的原型為:
        void *malloc (unsigned int size)
        其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注意的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否為NULL并執行相應的操作。
        下例是一個動態分配的程序:
        #include
        #include
        main()
        {
        int count,*array; /*count是一個計數器,array是一個整型指針,也可以理解為指向一個整型數組的首地址*/
        if((array(int *) malloc(10*sizeof(int)))==NULL)
        {
        printf(“不能成功分配存儲空間。”);
        exit(1);
        }
        for (count=0;count〈10;count++) /*給數組賦值*/
        array[count]=count;
        for(count=0;count〈10;count++) /*打印數組元素*/
        printf(“%2d”,array[count]);
        }
        上例中動態分配了10個整型存儲區域,然后進行賦值并打印。例中if((array(int *) malloc(10*sizeof(int)))==NULL)語句可以分為以下幾步:
        1)分配10個整型的連續存儲空間,并返回一個指向其起始地址的整型指針
        2)把此整型指針地址賦給array
        3)檢測返回值是否為NULL
        2、free函數
        由于內存區域總是有限的,不能不限制地分配下去,而且一個程序要盡量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變量或者程序使用。這時我們就要用到free函數。
        其函數原型是:
        void free(void *p)
        作用是釋放指針p所指向的內存區。
        其參數p必須是先前調用malloc函數或calloc函數(另一個動態分配存儲區域的函數)時返回的指針。給free函數傳遞其它的值很可能造成死機或其它災難性的后果。
        注意:這里重要的是指針的值,而不是用來申請動態內存的指針本身。例:
        int *p1,*p2;
        p1=malloc(10*sizeof(int));
        p2=p1;
        ……
        free(p2) /*或者free(p2)*/
        malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作為free函數的參數。
        malloc函數是對存儲區域進行分配的。
        free函數是釋放已經不用的內存區域的。
        所以由這兩個函數就可以實現對內存區域進行動態分配并進行簡單的管理了。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲国产精品不卡毛片a在线| 伊人精品视频在线| 久久久久无码精品国产app| 国产精品怡红院永久免费| 亚洲AV无码久久精品蜜桃| 99精品福利国产在线| freesexvideos精品老师毛多| 中国精品18videosex性中国 | 91午夜精品亚洲一区二区三区| 久久Av无码精品人妻系列| 欧美精品丝袜久久久中文字幕| 国产精品美女久久久网AV| 精品一区二区久久| 国产91久久精品一区二区| 国产欧美日韩精品丝袜高跟鞋| 少妇精品无码一区二区三区| 国产激情精品一区二区三区| 久久精品国产精品国产精品污| 久久久久久国产精品无码下载| 久久丫精品国产亚洲av| 亚洲爆乳无码精品AAA片蜜桃| 国产乱人伦偷精品视频不卡| 国产精品国产AV片国产| 国产成人亚洲精品91专区手机| 亚洲国产成人精品不卡青青草原| 国产高清在线精品一区| 成人午夜精品网站在线观看| 国产成人精品无码免费看| 国产色婷婷五月精品综合在线| 精品久久久久香蕉网| 久久精品国产第一区二区三区| 精品亚洲麻豆1区2区3区| 精品国产a∨无码一区二区三区| 久久久无码人妻精品无码| 久久久久久亚洲精品成人| 精品久久无码中文字幕| 99精品一区二区三区无码吞精| 国产精品55夜色66夜色| 四虎影视国产精品永久在线| 国产99精品一区二区三区免费| 国产精品一香蕉国产线看观看|