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; }