一、malloc函数的介绍和用法
malloc函数是C语言中的一种动态内存分配函数,它的声明在stdlib.h中,函数原型如下:
void* malloc(size_t size);
其中size为申请内存的大小,返回值是指向void类型的指针,指向申请的内存起始地址。
使用malloc函数申请内存可以用于需要动态分配内存的程序,比如链表、数组等等。
二、malloc函数的基本使用
下面是一个简单的基于C语言的malloc函数使用示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
int num, i;
printf("请输入要申请的整数个数:");
scanf("%d", &num);
ptr = (int*) malloc(num * sizeof(int)); // 用malloc申请一段内存空间,大小为num个整数
if (ptr == NULL) // 如果申请失败,输出提示信息
{
printf("Memory allocation failed.\n");
exit(1);
}
printf("请输入%d个整数:\n", num);
for (i = 0; i < num; i++) // 输入num个整数
{
scanf("%d", ptr + i);
}
printf("你输入的%d个整数是:\n", num);
for (i = 0; i < num; i++) // 输出num个整数
{
printf("%d ", *(ptr + i));
}
free(ptr); // 释放内存空间
return 0;
}
该实例中为了在内存中存储num个整数,使用了malloc函数,成功申请内存后,将返回一个指向int类型的指针,在使用过程中需要注意:
- 及时释放内存空间,避免内存泄漏
- 必要时判断申请内存的指针是否为空,以避免程序崩溃
三、calloc函数和realloc函数
malloc是C语言中常用的内存分配函数,但实际上C语言还有其他两个常用的动态内存分配函数:calloc函数和realloc函数。
与malloc函数不同,calloc函数在分配内存时回把分配的内存空间清零。下面是一个基于C语言的calloc函数使用示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
int num, i;
printf("请输入要申请的整数个数:");
scanf("%d", &num);
ptr = (int*) calloc(num, sizeof(int)); // 用calloc申请一段内存空间,大小为num个整数
if (ptr == NULL) // 如果申请失败,输出提示信息
{
printf("Memory allocation failed.\n");
exit(1);
}
printf("请输入%d个整数:\n", num);
for (i = 0; i < num; i++) // 输入num个整数
{
scanf("%d", ptr + i);
}
printf("你输入的%d个整数是:\n", num);
for (i = 0; i < num; i++) // 输出num个整数
{
printf("%d ", *(ptr + i));
}
free(ptr); // 释放内存空间
return 0;
}
calloc与malloc实际上用法是类似的,不过可以看到,calloc的第一个参数n表示要申请的内存块数,而不是malloc的样板参数。第二个参数size是内存块的大小,返回值是一个指向void类型的指针。
realloc函数的作用是重新分配内存空间,即在原内存空间扩展或收缩一定的空间,下面是一个基于C语言的realloc函数使用示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
int num, i;
printf("请输入要申请的整数个数:");
scanf("%d", &num);
ptr = (int*) malloc(num * sizeof(int)); // 用malloc申请一段内存空间,大小为num个整数
if (ptr == NULL) // 如果申请失败,输出提示信息
{
printf("Memory allocation failed.\n");
exit(1);
}
printf("请输入%d个整数:\n", num);
for (i = 0; i < num; i++) // 输入num个整数
{
scanf("%d", ptr + i);
}
printf("你输入的%d个整数是:\n", num);
for (i = 0; i < num; i++) // 输出num个整数
{
printf("%d ", *(ptr + i));
}
printf("\n请输入新的整数个数:");
scanf("%d", &num);
ptr = (int*) realloc(ptr, num * sizeof(int)); // 重新申请内存空间
if (ptr == NULL) // 如果申请失败,输出提示信息
{
printf("Memory allocation failed.\n");
exit(1);
}
printf("请输入%d个整数:\n", num);
for (i = 0; i < num; i++) // 输入num个整数
{
scanf("%d", ptr + i);
}
printf("你输入的%d个整数是:\n", num);
for (i = 0; i < num; i++) // 输出num个整数
{
printf("%d ", *(ptr + i));
}
free(ptr); // 释放内存空间
return 0;
}
可以看到,在使用realloc函数时,需要传入原内存空间的指针和新的内存空间大小(即分配的字节数),如果操作成功,那么该函数会返回新的指针值,指向从原始内存中复制过来的数据,原始内存将被释放,以避免内存泄漏。
四、动态内存分配的优缺点
使用动态内存分配功能的优点:
- 可以更加灵活地管理内存,在程序的运行过程中只有需要内存时才会得到申请,在不需要时及时释放。
- 可以节省程序的内存空间,增强程序的可读性和可维护性。
使用动态内存分配功能的缺点:
- 相较于静态内存分配,需要更多的计算机处理时间。
- 应用程序必须负责释放所使用的动态内存,否则会导致内存泄漏。
- 动态内存分配过多会导致内存碎片问题。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/159183.html