位置:首頁 > 高級語言 > C語言教學 > C語言內存管理

C語言內存管理

本章將介紹C語言動態內存管理. C語言編程語言提供了多種功能的內存分配和管理。這些函數可以在<stdlib.h中>頭文件中找到。

S.N. 函數與說明
1 void *calloc(int num, int size);
此函數分配num元素其中每一個字節大小為(size)的數組
2 void free(void *address); 
此函數釋放由地址指定的存儲器塊的塊
3 void *malloc(int num); 
這個函數分配num個字節數組,並把它們初始化
4 void *realloc(void *address, int newsize); 
此函數重新分配內存達其擴展newsize

分配內存動態

當編寫程序,如果知道一個數組的大小,那麼它是很簡單的,可以把它定義為一個數組。例如存儲任何人的名字,它可以最多100個字符,這樣就可以定義的東西如下:

char name[100];

但是,現在讓我們考慮一個情況,如果不知道需要存儲文本的長度,比如想存儲有關的話題的詳細說明。在這裡,我們需要定義一個指針字符冇有定義的基礎上規定,如在下麵的例子中,我們可以分配的內存是多少內存要求更長字段:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char name[100];
   char *description;

   strcpy(name, "Zara Ali");

   /* allocate memory dynamically */
   description = malloc( 200 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory
");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student in class 10th");
   }
   printf("Name = %s
", name );
   printf("Description: %s
", description );
}

當上述代碼被編譯和執行時,它產生了以下結果。

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

同樣的程序可以通過calloc()隻需要用calloc代替malloc完成如下:

calloc(200, sizeof(char));

所以完全的控製,可以通過任何大小的值,而分配的內存在不同的地方,一旦定義的大小之後就不能改變數組。

調整大小和釋放內存

當程序執行出來後,操作係統會自動釋放所有程序,但作為一個很好的做法,當不在需要的內存分配的內存了,那麼應該通過調用free()函數釋放內存。

另外,也可以增加或通過調用realloc()函數減少已分配的內存塊的大小。讓我們再一次檢查上麵的程序,並利用realloc()和free()函數:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char name[100];
   char *description;

   strcpy(name, "Zara Ali");

   /* allocate memory dynamically */
   description = malloc( 30 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory
");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student.");
   }
   /* suppose you want to store bigger description */
   description = realloc( description, 100 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory
");
   }
   else
   {
      strcat( description, "She is in class 10th");
   }
   
   printf("Name = %s
", name );
   printf("Description: %s
", description );

   /* release memory using free() function */
   free(description);
}

當上述代碼被編譯和執行時,它產生了以下結果。

Name = Zara Ali
Description: Zara ali a DPS student.She is in class 10th

可以試試上麵的例子不重新分配額外的內存,那麼strcat()函數將因缺乏描述可用內存給出一個錯誤。