引言:數組的元素存儲于內存中連續的位置上。當一個數組被聲明時,它所需要的內存在編譯時就被分配。但是,我們可以使用動態內存分配在運行時為它分配內存。
一塊內存的生命周期可以分為四個階段:分配、初始化、使用、釋放。
內存的分配一般使用C函數庫里的malloc函數(原型:void *malloc(size_t size))。關于malloc函數應該注意一下幾點:
1、malloc的參數就是需要分配的內存的字節數。
2、malloc所分配的是一塊連續的內存。
3、分配成功,則返回指向分配內存起始地址的指針。分配失敗,返回NULL指針。
4、對每個malloc返回的指針都進行檢查,是好的習慣。
內存的初始化一般要在使用之前手動進行,也可以在分配時由calloc函數一同完成:將分配內存初始化為0。使用就是使用分配所返回的指向內存的指針。
釋放內存是為了防止內存泄露,一般使用free函數(原型:void free(void *pointer))完成。它的參數必須是先前從malloc、calloc或realloc返回的值。向free傳遞一個NULL參數不會產生任何效果。向free傳遞其他參數會出錯。
**注意:常見的動態內存錯誤有以下幾種**
1、忘記對NULL指針進行解引用操作,即忘記對分配返回的值做判斷。
2、對分配的內存進行操作時越過邊界。
3、釋放并非動態分配的內存,傳遞給free的必須是一個從malloc、calloc或realloc返回的指針。
4、試圖釋放一塊動態分配的內存的一部分。
5、一塊動態內存被釋放后被繼續使用。
使用動態內存的編程總結:
1、動態內存分配有助于消除程序內部存在的限制。
2、使用sizeof計算數據類型的長度,調高程序的可移植性。
補充:calloc和realloc函數
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
calloc與malloc的區別一是前者返回指向內存的指針之前把它初始化為0.二是calloc的參數包括所需元素的數量和每個元素的字節數。根據這些值,能夠計算出總共需要分配的內存。
realloc函數用于修改一個原先已經分配的內存卡的大小。使用該函數,可以使一塊內存擴大或縮小。如果原先的內存卡無法改變大小,realloc將分配另一塊正確大小的內存,并把原先那塊內存的內容復制到新的塊上。
- 前言
- (四)回調函數
- (一)while(1)死循環與for(;;)死循環的區別
- (二)static關鍵字
- (三)函數
- (四)可變參數函數
- (五)setjmp和longjmp
- (六)指針
- (七)回調函數
- (八)字符串
- (九)動態內存分配
- (十)結構體
- (十一)深入理解指針
- (十二)命令行參數
- (十三)printf、fprintf、sprintf和snprintf函數
- (十四)const關鍵字詳解
- (十五)字符串輸入函數fgets、gets和scanf
- (十六)字符串輸出函數puts、fputs和printf
- (十七)字符/字符串輸出函數fputc、fputs、putc、putchar和puts
- (十八)字符/字符串輸入函數fgetc、fgets、getc、getchar和gets
- (十九)restrict關鍵詞
- (二十)scanf函數詳解
- (二一)內聯函數
- (二二)位操作
- (二三)errno變量
- (二四)內存分配