当前位置:   article > 正文

c语言-实现动态内存管理的库函数_c语言中用来动态分配内存的库函数有

c语言中用来动态分配内存的库函数有


前言

本篇文章介绍c语言中实现动态内存管理的库函数,比如malloc()、free()、calloc()、realloc()

一、什么是动态内存分配

在一般情况下,通过以下方式开辟内存空间

	int var = 20;  //在栈空间开辟4个字节的
	char str[10] = {0}; //在栈空间开辟10个字节连续的空间
  • 1
  • 2

上面开辟空间的方式有两个特点:

  1. 开辟空间的大小是固定的,不可变的
  2. 在栈中开辟,并且在编译时分配空间

当需要在程序运行过程中才能知道所有空间的大小时,这时候就需要动态内存分配。
动态内存分配是指在程序运行过程中,可以动态地向操作系统申请内存空间。
在c语言中,可以借助malloc()、free()、calloc()、realloc()这几个库函数实现动态内存的管理。
在这里插入图片描述


二、malloc()和free()

2.1 malloc()介绍

下面是cplusplus网站关于malloc()函数的介绍,如下:
在这里插入图片描述
作用:申请size个字节内存空间
说明:

  • 申请size个字节的空间
  • 分配的内存空间是没有经过初始化的,存储的是不定值

返回值说明:

  1. 如果传入的参数size为0,返回值为的标准未定义,由实现的编译器决定。
  2. 如果申请成功,返回这块内存空间的起始位置的指针,类型为void*,可以通过强制类型转换为期望解引用的类型
  3. 如果申请失败,返回一个空指针NULL

2.2 malloc()的使用

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
int main()
{
	//申请40个字节
	int* p = (int*)malloc(40);

	//判断申请是否成功
	if (NULL == p)
	{
		printf("%s", strerror(errno));
		return 1;
	}
	//使用空间
	int i = 0;
	int sz = 40 / sizeof(int);
	for (i = 0; i < sz; i++)
	{
		*(p + i) = i;
	}
	//打印
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	//使用完之后,释放空间
	free(p);
	p = NULL;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

2.3 free()介绍

下面是cplusplus网站关于free()函数的介绍,如下:
在这里插入图片描述
作用:释放通过malloc()、calloc()、realloc()函数申请的空间
说明:

  • 如果ptr不是指向由malloc()、calloc()、realloc()申请的空间,那么释放时会引起未定义
  • 如果ptr为空指针,那么这个函数什么也不做。
  • 释放ptr指向的空间时,ptr本身的值不会被改变,即ptr依然会指向被释放的空间。所以,在释放ptr指向的空间后,应将ptr置为空指针。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
int main()
{
	//申请40个字节
	int* p = (int*)malloc(40);

	//判断申请是否成功
	if (NULL == p)
	{
		printf("%s", strerror(errno));
		return 1;
	}
	//使用空间
	int i = 0;
	int sz = 40 / sizeof(int);
	for (i = 0; i < sz; i++)
	{
		*(p + i) = i;
	}
	//使用完之后,释放空间
	free(p);
	p = NULL;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

通过vs的内存监视查看(未释放前)
在这里插入图片描述
利用free()释放p指向的空间后
在这里插入图片描述
通过结果得出,free(p)释放p指向的空间后,p的指向没有改变,为了避免越界访问,因此可以将p = NULL

三、calloc()

3.1 calloc()介绍

下面是cplusplus网站关于calloc()函数的介绍,如下:
在这里插入图片描述
作用:申请一块num个size字节大小的连续空间。
说明:

  • 与malloc()不同之处的是,calloc()会在申请成功后,将每个字节初始化为0
  • 如果传入的参数size为0,返回值为的标准未定义,由实现的编译器决定,且返回值不可解引用。
  • 如果申请成功,返回这块内存空间的起始位置的指针,类型为void*,可以通过强制类型转换为期望解引用的类型
  • 如果申请失败,返回一个空指针NULL

3.2 calloc()使用

申请10个int大小的空间(10*sizeof(int)个字节)

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
//申请10个int的空间
int main()
{
	int* p = (int*)calloc(10, sizeof(int));

	if (NULL == p)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//释放空间
	free(p);
	p = NULL;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

通过vs的内存监视查看
在这里插入图片描述
calloc()申请成功后,将每个字节初始化为了0,也可利用malloc()+memset()实现。

四、realloc()

4.1 realloc()介绍

下面是cplusplus网站关于realloc()函数的介绍,如下:
在这里插入图片描述

作用:将ptr指向的内存块的大小改变为size个字节大小
说明:

  • 如果ptr是一个空指针,那么realloc()的作用与malloc()一样,都是申请size个字节大小的连续内存
  • realloc()申请内存时,申请得到的内存分为两种情况(扩容:申请大于ptr指向的内存大小
    假设ptr指向的内存块大小为40个字节,现扩容到80个字节:
  1. 在ptr指向的内存块后面直接扩容
    在这里插入图片描述

  2. 开辟一块大小为size的新空间
    在这里插入图片描述
    在这种情况下,在扩容成功后,会将原始内存的内容拷贝到扩容内存中,然后释放原始内存。

4.2 realloc()使用

  1. 传入空指针
    在这里插入图片描述
  2. 扩容
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
	//申请10个int的空间
	int* p = (int*)malloc(10*sizeof(int));

	if (NULL == p)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	memset(p, 0, 40);
	//扩容将p指向的内存块扩容到80个字节
	int* pp = (int*)realloc(p, 80);

	if (pp != NULL)
	{
		p = pp;
		pp = NULL;

	}
	//释放p
	free(p);
	p = NULL;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

通过vs的内存监视查看内存情况
在这里插入图片描述
p和pp指向的空间不相同,说明此次扩容是在新的内存上开辟;同时,pp的前40个字节的内容和p的40个字节的内容是相同的,说明新扩容的内存将原始内存的内容进行了拷贝。


总结

本篇文章介绍了在c语言中实现动态内存管理的四个库函数,malloc()、free()、calloc()、realloc()。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号