本章介绍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替换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()函数会因描述中缺少可用内存而产生错误.