C语言中的动态内存分配是什么?
在这里,我们将了解C语言中的动态内存分配。C编程语言提供了多个用于内存分配和管理的函数。这些函数可以在<stdlib.h>头文件中找到。以下是用于内存分配的函数。
| 函数 | 描述 |
|---|---|
void *calloc(int num, int size); | 此函数分配一个包含**num**个元素的数组,每个元素的大小(以字节为单位)为size。 |
void free(void *address); | 此函数释放由address指定的内存块。 |
void *malloc(int num); | 此函数分配一个包含**num**个字节的数组,并将其保留为未初始化状态。 |
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, "Adam");
/* allocate memory dynamically */
description = malloc( 200 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory
");
} else {
strcpy( description, "Adam a DPS student in class 10th");
}
printf("Name = %s
", name );
printf("Description: %s
", description );
}输出
Name = Zara Ali Description: Zara ali a DPS student in class 10th
可以使用calloc()编写相同的程序;唯一需要做的就是将malloc替换为calloc,如下所示:
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, "Adam");
/* allocate memory dynamically */
description = malloc( 30 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory
");
} else {
strcpy( description, "Adam 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, "He is in class 10th");
}
printf("Name = %s
", name );
printf("Description: %s
", description );
/* release memory using free() function */
free(description);
}输出
Name = Adam Description: Adam a DPS student.He is in class 10th
您可以尝试在不重新分配额外内存的情况下运行上述示例,由于description中可用内存不足,strcat()函数将报错。
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C编程
C++
C#
MongoDB
MySQL
Javascript
PHP