歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

一步一步學Linux C:淺談動態內存

使用動態內存時需要用戶自己去申請資源和釋放資源。用戶可以隨時的分配所需空間,根據需要分配空間大小,並在最後釋放申請內存。

動態內存也存在隱患:在大型的項目當中管理申請的動態內存是很復雜的,以及釋放申請的內存有難想起的。在釋放動態內存時可能不止一個指針指向了該內存,所以釋放的時候是很容易出錯的。內存無法釋放就會造成內存洩露,這也就是為什麼服務器要經常的每個一段時間重啟的原因。

內存管理操作:

分配內存函數:

  1. #include <stdlib.h>  
  2. void *malloc(size_t size)   
  3. void *calloc(size_t nmemb,size_tsize)  

函數malloc中size是分配內存的大小,以字節為單位。

函數calloc中size是數據項的大小,nmemb是數據項的個數。所以分配內存大小為size*nmemb

malloc和calloc的最大區別是calloc會把申請到的內出初始化為0

調用成功都會返回分配內存的指針,調用失敗都返回NULL

內存的調整:

對於realloc(),函數原型是void* realloc(void *ptr,size_t  size),改變ptr所指內存區域的大小為size長度,size可以大於或小於原動態內存的大小,realloc通常是在原數據的基礎上調整動態內存的大小是,原數據內容不變。當size大於原來的數據,且在原來位置無法調整時,realloc會重新開辟內存,把原來的數據復制到這來。如果重新分配成功則返回指向被分配內存的指針,否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。有一點需要注意:當分配內存成功之後,應將原本的指針ptr=NULL,否則會形成野指針,可能造成系統崩潰。不論是以上那種方式申請內存,在申請內存之後,最終都要用free釋放空間,不然會造成內存洩漏。

如果ptr為NULL時realloc相當於malloc,如果size=0時相當於free

內存的釋放:

  1. #include<stdlib.h>   
  2. voidfree(void *pr);  

free用於釋放有malloc或calloc申請的動態內存。內存釋放後再去使用指針會發生錯誤。

實例如下:

  1. #include <stdio.h>   
  2.   
  3. #include <stdlib.h>   
  4.   
  5.    
  6.   
  7. char *alloc_test();  
  8.   
  9.    
  10.   
  11. main()  
  12.   
  13. {  
  14.   
  15.      char*p1,*p2;  
  16.   
  17.      p1= alloc_test();  
  18.   
  19.      p2= p1;  
  20.   
  21.      printf("%s\n",p1);  
  22.   
  23.      printf("%s\n",p2);  
  24.   
  25.      free(p1);  
  26.   
  27.      //free(p2);   
  28.   
  29. }  
  30.   
  31. char *alloc_test()  
  32.   
  33. {  
  34.   
  35.      char*pchar = malloc(20);  
  36.   
  37.      strcpy(pchar,"helloalloc_test");  
  38.   
  39.      returnpchar;  
  40.   
  41. }  

要把free(p2);注釋掉

否則會出錯,以為p1,p2同時指向了一個內存,通過p1釋放了內存塊,當通過p2再次釋放內存當然就出錯了。

pchar也指向了內存塊,但是又過p1釋放的內存,因為調用完alloc_test後pchar配釋放了當內存塊並沒有被釋放。

Copyright © Linux教程網 All Rights Reserved