目录

C - 内存管理(Memory Management)

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

Sr.No. 功能说明
1

void *calloc(int num, int size);

此函数分配一个num元素数组,每个元素的大小以字节为单位。

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\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(); 唯一的问题是你需要用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\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()函数将给出错误。

↑回到顶部↑
WIKI教程 @2018