目录

前言

1、动态内存函数的介绍

1.1 malloc和free

1.2 calloc函数​编辑

结语


前言

        在我们之前对于c语言的学习中,我们知道,当我们要存放数据时,可以定义相应的变量取存放,但是在变量定义后,其大小是无法改变的,如果定义了一个int类型的变量c,那么对于c来说,他就会一直保持4字节的大小,不能存放8字节的数据。

        那么我们今天学习的内容就是实现对内存的动态管理,内存会跟着内容发生改变,实现对内存的最大效率使用,这就是你动态内存管理。 

        对于动态内存管理的学习,我们主要掌握4个函数的用法:malloc;calloc;realloc;free。

1、动态内存函数的介绍

1.1 malloc和free

        malloc介绍:

C语言:动态内存管理(上)-LMLPHP

        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;
}

效果:        C语言:动态内存管理(上)-LMLPHP

        我们分三部分讲解

        第一部分:内存开辟

        C语言:动态内存管理(上)-LMLPHP

        这一部分,用malloc申请空间,使用malloc时要包含头文件stdlib.h。申请好空间后,需要对其进行判断,判断是否开辟成功,如果失败,则p为空指针,后面的程序就不能运行,需要我们检测出并报错,这里就用到了strerror这个报错函数,他会将错误码翻译成错误内容,翻译后我们用printf进行打印就好了。

        第二部分:内存使用

C语言:动态内存管理(上)-LMLPHP

        这个使用就和正常的指针使用是一样的。

        第三部分:空间释放:

C语言:动态内存管理(上)-LMLPHP

        用free函数对p的空间进行释放,然后使p指针变为空指针。

        注意,free函数只能针对malloc开辟的空间进行释放,所以如果我们对其他指针指向的内容用free释放时,会报错。

        malloc和free函数就先将到这,下面我们来讲另一个函数:calloc

1.2 calloc函数C语言:动态内存管理(上)-LMLPHP

        该函数参数有两个,第一个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;
}

        效果:C语言:动态内存管理(上)-LMLPHP        与malloc相似,分成三个部分,开辟,使用(打印)和释放。

        我们发现,用calloc开辟空间后直接打印出来,发现内容都是0。calloc和malloc区别其实就是初始化。如果想初始化就用calloc,如果不想,就用malloc。

        calloc函数就讲到这。

结语

        本篇先将这两个函数:malloc和calloc,下一篇再继续讲解。

03-29 07:07