C语言 内存管理

  • 内存管理

    本章介绍了用C语言进行的动态内存管理。C编程语言提供了几种用于内存分配和管理的功能。这些函数可以在<stdlib.h>头文件中找到。
    函数 说明
    void *calloc(int num, int size); 此函数分配一个num元素数组,每个元素的大小(以字节为单位)将为size。
    void free(void *address); 此函数释放由地址指定的存储块。
    void *malloc(int num); 此函数分配一个num个字节的数组,并使它们未初始化。
    void *realloc(void *address, int 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替换malloc,如下所示:
    
    calloc(200, sizeof(char));
    
    因此,您拥有完全的控制权,并且可以在分配内存时传递任何大小值,这与数组中定义的大小无法更改的数组不同。
  • 调整大小和释放内存

    当您的程序发布时,操作系统会自动释放由程序分配的所有内存,但是作为一种好习惯,当您不再需要内存时,应该通过调用函数free()释放该内存。另外,您可以通过调用函数realloc()来增加或减少分配的内存块的大小。让我们再次检查以上程序,并使用realloc()free()函数-
    
    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( 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()函数将给出错误。