C语言中,内存管理是非常重要的,尤其是在处理动态内存分配时。C语言的内存管理主要依赖于标准库中的四个函数:malloc()、calloc()、realloc() 和 free()。这些函数用于在程序运行时动态分配、重新分配和释放内存。它们都声明在 <stdlib.h> 头文件中。本文主要介绍C语言中内存管理及相关函数。

1、内存管理函数

C 语言为内存提供分配和管理的函数。这些函数可以在 <stdlib.h> 头文件中找到。如下表,

序号

函数和描述

1

void *calloc(int num, int size);

在内存中动态地分配 num 个长度为 size 的连续空间,

并将每一个字节都初始化为 0。

所以它的结果是分配了 num*size 个字节长度的内存空间,

并且每个字节的值都是0。

2

void free(void *address);

该函数释放 address 所指向的内存块,

释放的是动态分配的内存空间。

3

void *malloc(int num);

在堆区分配一块指定大小的内存空间,

用来存放数据。

这块内存空间在函数执行完成后不会被初始化,

它们的值是未知的。

4

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

该函数重新分配内存,把内存扩展到

newsize

2、动态分配内存

数组是固定数量的值的集合,在声明数组的大小之后,无法更改。有时,数组大小可能不够,就需要动态扩容。解决此问题,可以在运行时手动分配内存。这在C编程中称为动态内存分配。

例如,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
   char name[100];
   char *desc;
   strcpy(name, "cjavapy");
   /* 动态分配内存 */
   desc = (char *)malloc( 200 * sizeof(char) );
   if( desc == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( desc, "www.cjavapy.com");
   }
   printf("name = %s\n", name );
   printf("desc = %s\n", desc );
  free(desc);
}

3、释放内存及修改已分配内存大小

虽然程序退出时,操作系统会自动释放所有分配给程序的内存,但是一般已分配的内存不用时,都应该调用函数 free() 来释放内存。

也可以调用函数 realloc() 来增加或减少已分配的内存块的大小。

例如,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
   char name[100];
   char *desc;
   strcpy(name, "cjavapy");
   /* 动态分配内存 */
   desc = (char *)malloc( 30 * sizeof(char) );
   if( desc == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( desc, "www.cjavapy.com");
   }
   /* 需要存储更多信息 */
   desc = (char *) realloc( desc, 50 * sizeof(char) );
   if( desc == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcat( desc, "c java py cjavapy cjavapy.com");
   }
   printf("name = %s\n", name );
   printf("desc: %s\n", desc );
   /* 使用 free() 函数释放内存 */
   free(desc);
}

注意:分配内存时,要判断一下系统是否有足够的内存分配。

4、calloc() — 分配并初始化内存

calloc(contiguous allocation)用于分配指定数量的内存块,每个块有指定的大小,并将分配的内存初始化为零。与 malloc 不同,calloc 初始化分配的内存为0

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = (int*)calloc(5, sizeof(int));  // 分配并初始化5个整数大小的内存
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;  // 如果分配失败,返回错误
    }

    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);  // 所有元素初始值为0
    }

    free(arr);  // 释放内存
    return 0;
}

5、防止野指针

free 释放了某块内存后,指针仍然指向这块内存。最好将指针置为 NULL,以避免误用已释放的内存。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = (int*)malloc(5 * sizeof(int));
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // 释放内存后将指针置为空
    free(arr);
    arr = NULL;

    return 0;
}

推荐文档