什么是C中的动态内存分配?
在这里,我们将了解什么是C中的动态内存分配。C编程语言提供了几种用于内存分配和管理的功能。这些功能可以在<stdlib.h>头文件中找到。以下功能用于内存分配。
功能 | 描述 |
---|---|
无效* calloc(int num,int size); | 此函数分配一个num元素数组,每个元素的大小(以字节为单位)将为size。 |
void free(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\n");
} else {
strcpy( description, "Adam a DPS student in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
}
输出结果
Name = Zara AliDescription: 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, "Adam");
/* allocate memory dynamically */
description = malloc( 30 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy( description, "Adam是DPS的学生。");
}
/* 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, "He is in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
/* release memory using free() function */
free(description);
}
输出结果
Name = AdamDescription: Adam是DPS的学生。He is in class 10th
您可以尝试上面的示例,而无需重新分配额外的内存,strcat()
由于描述中缺少可用内存,因此函数将产生错误。
以上是 什么是C中的动态内存分配? 的全部内容, 来源链接: utcz.com/z/351527.html