目录
前言
在我们之前对于c语言的学习中,我们知道,当我们要存放数据时,可以定义相应的变量取存放,但是在变量定义后,其大小是无法改变的,如果定义了一个int类型的变量c,那么对于c来说,他就会一直保持4字节的大小,不能存放8字节的数据。
那么我们今天学习的内容就是实现对内存的动态管理,内存会跟着内容发生改变,实现对内存的最大效率使用,这就是你动态内存管理。
对于动态内存管理的学习,我们主要掌握4个函数的用法:malloc;calloc;realloc;free。
1、动态内存函数的介绍
1.1 malloc和free
malloc介绍:
malloc是开辟内存块函数,传递的参数是要开辟的空间大小,返回的是指向所开辟空间的起始地址。
注意,在使用malloc时,是有可能申请失败的,如果申请的空间太大,计算机无法满足时,就会失败。
malloc函数使用,举个例子:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//动态内存开辟
int* p = (int*)malloc(40);
if (p == NULL) //判断是否开辟成功,开辟失败就报错。
{
printf("%s\n", strerror(errno));
return 1;
}
//使用
int i = 0;
for (i = 0;i < 10;i++)
{
*(p + i) = i;
}
for (i = 0;i < 10;i++)
{
printf("%d ", *(p + i));
}
//空间释放
free(p);
p = NULL;
return 0;
}
效果:
我们分三部分讲解
第一部分:内存开辟
这一部分,用malloc申请空间,使用malloc时要包含头文件stdlib.h。申请好空间后,需要对其进行判断,判断是否开辟成功,如果失败,则p为空指针,后面的程序就不能运行,需要我们检测出并报错,这里就用到了strerror这个报错函数,他会将错误码翻译成错误内容,翻译后我们用printf进行打印就好了。
第二部分:内存使用
这个使用就和正常的指针使用是一样的。
第三部分:空间释放:
用free函数对p的空间进行释放,然后使p指针变为空指针。
注意,free函数只能针对malloc开辟的空间进行释放,所以如果我们对其他指针指向的内容用free释放时,会报错。
malloc和free函数就先将到这,下面我们来讲另一个函数:calloc
1.2 calloc函数
该函数参数有两个,第一个size_t num指要开辟元素的个数,size_t size是每个元素的大小。返回值为开辟空间的首地址指针。这个函数还有一个特点,就是在返回地址之前,会将开辟的空间初始化一遍(全0)。
程序案例:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//开辟
int* p = (int*)calloc(10, sizeof(int));
if (p == NULL) //判断是否开辟成功,开辟失败就报错。
{
printf("%s\n", strerror(errno));
return 1;
}
//打印
int i = 0;
for (i = 0;i < 10;i++)
{
printf("%d ", *(p + i));
}
//释放
free(p);
p = NULL;
return 0;
}
效果: 与malloc相似,分成三个部分,开辟,使用(打印)和释放。
我们发现,用calloc开辟空间后直接打印出来,发现内容都是0。calloc和malloc区别其实就是初始化。如果想初始化就用calloc,如果不想,就用malloc。
calloc函数就讲到这。
结语
本篇先将这两个函数:malloc和calloc,下一篇再继续讲解。