淺析存儲管理函數

   很多像我一樣的C語言學習者在學到內存管理函數的時候都會充滿疑惑。雜雜的函數分不清楚,今天小編整理一下,方便大家,也希望大家指正,一起交流。

  C語言標準庫中,提供了一組用於動態管理內存的函數,這些函數定義在allo.h頭文件裏。使用它們時需要增加#include<alloc.h>命令。下面介紹這些函數的用法和注意事項。

 1. calloc函數

  原型:  void * calloc (size_t  num1, size_t  num2);

  功能:分配num1個大小爲num2字節的內存單元。若成功分配,則返回所分配的內存單元的首字節的指針;否則,返回NULL;

  例子:

       int * pstr=(int *)calloc(200, sizeof(int));

2.malloc函數

原型:  void * malloc (size_t size);

功能:分配大小爲size的內存空間,若分配成功,則返回所分配內存單元的第一個字節的指針;若分配失敗,則返回NULL。

例子:

         int * p= (int *)malloc( sizeof (int) );

3.修改內存單元大小的函數realloc

原型: void * realloc (void * p , size_t size);

功能:將p所指向的內存單元的大小,變化到size個字節。若變動成功,則返回新內存單元的第一個內存單元的指針;若變動失敗,則返回NULL。

例子:

      char *p =(char*)malloc(sizeof(char));

      p=(char *) realloc (p, 100*sizeof(char));

4.free函數

原型:  void free (void * block) ;

功能:釋放指定存儲空間;

例子: 

         int *p=malloc(100);

         free (p)


下面寫幾點備註:

1.在有的編譯器裏,這些內存管理函數是被包含在stdlib.h這個頭文件裏的。

2.類型轉換 (【數據類型】 * p)將函數返回的地址轉換成某數據類型的指針。之所以可能會對這些內存管理函數的返回值做轉換是因爲這些函數返回的是一個void類型的指針,寫成void *。類型void *的指針可以指向任意類型的數據,然而不能取消對void指針的引用,因爲它指向未具體說明的對象。不過許多優化的編譯器會自動把這些函數返回的地址轉換成賦值語句左邊的指針類型。不過,加上顯式類型轉換指令是無害的。

3.關於realloc函數的進一步說明,詳見文章《realloc和堆、棧的幾點說明》



本文部分參考了《C語言與程序設計》(王瑞民、盧紅星等)、《C語言入門經典》(Ivor Horton著)兩書,特此致謝。


發佈了29 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章