English 中文(简体)
C. 记忆管理
  • 时间:2024-11-03

C - Memory Management


Previous Page Next Page  

本章解释了C的动态记忆管理。 C方案拟订语言为记忆分配和管理规定了若干职能。 这些职能见<stdpb.h>。 头盔档案。

Sr.No. Function & Description
1

避免* 回顾(int num, int small);

这一职能分配一系列num 每一尺寸的单位为size

2

这项职能释放了一个由地址标明的记忆组。

3

这项职能分配一系列的num,并使它们不成为初始。

4

这项职能将记忆重新定位至newsize

Allocating Memory Dynamically

虽然方案拟定工作如果你知道一个阵列的规模,那是容易的,你可以把它界定为一个阵列。 例如,为了储存任何人的名字,可以最多100个,这样你就可以界定如下内容:


char name[100];

但现在,让我们考虑这样一种情况,即你对你需要储存的文本长度没有想法,例如,你想详细描述一个议题。 在这里,我们需要界定一个特征的点,而不必确定需要多少记忆,此后,根据要求,我们可以按以下例子来分配记忆——


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

int main() {

   char name[100];
   char *description;

   strcpy(name, "Zara Ap");

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

如果上述法典得到汇编和执行,则会产生以下结果。


Name = Zara Ap
Description: Zara ap a DPS student in class 10th

也可使用etoc(>);书写。 仅需要用下列电线取代小型电线:


calloc(200, sizeof(char));

因此,你完全掌握了控制权,在分配记忆时,你可以传递任何规模价值,而不同的是,一旦确定规模,你就无法改变。

Resizing and Releasing Memory

贵方案出台时,运行系统自动释放了贵方案所分配的所有记忆,但作为良好做法,如果你不再需要记忆,那么你就应该通过叫自由(<>)号的功能来释放这一记忆。

或者,你可以通过打电话到realloc()来增加或减少所分配记忆块的规模。 让我们再次检查上述方案,并利用真正和免费的职能——


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

int main() {

   char name[100];
   char *description;

   strcpy(name, "Zara Ap");

   /* allocate memory dynamically */
   description = malloc( 30 * sizeof(char) );
	
   if( description == NULL ) {
      fprintf(stderr, "Error - unable to allocate required memory
");
   } else {
      strcpy( description, "Zara ap 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 Ap
Description: Zara ap a DPS student.She is in class 10th

你可以尝试上述例子,而不重新分配额外记忆,而且由于描述中缺乏可用记忆,剧团的职能将产生错误。

Advertisements