📜  C-内存管理

📅  最后修改于: 2020-12-19 05:34:34             🧑  作者: Mango


本章介绍C语言中的动态内存管理。C编程语言提供了几种用于内存分配和管理的功能。这些功能可以在头文件中找到。

Sr.No. Function & Description
1

void *calloc(int num, int size);

This function allocates an array of num elements each of which size in bytes will be size.

2

void free(void *address);

This function releases a block of memory block specified by address.

3

void *malloc(int num);

This function allocates an array of num bytes and leave them uninitialized.

4

void *realloc(void *address, int newsize);

This function re-allocates memory extending it upto newsize.

动态分配内存

在编程时,如果您知道数组的大小,那么这很容易,您可以将其定义为数组。例如,要存储任何人的名字,最多可以包含100个字符,因此您可以定义以下内容-

char name[100];

但是,现在让我们考虑一种情况,您对存储的文本长度一无所知,例如,您想存储有关主题的详细说明。在这里,我们需要定义一个指向字符的指针,而无需定义需要多少内存,稍后,根据需求,我们可以分配内存,如下例所示:

#include 
#include 
#include 

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\n");
   } else {
      strcpy( description, "Zara ali a DPS student in class 10th");
   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", 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 
#include 
#include 

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\n");
   } 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\n");
   } else {
      strcat( description, "She is in class 10th");
   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );

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

编译并执行上述代码后,将产生以下结果。

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

您可以尝试上面的示例,而无需重新分配额外的内存,由于说明中缺少可用内存,strcat()函数将产生错误。