位置:首页 > 高级语言 > 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()函数将因缺乏描述可用内存给出一个错误。