C语言动态内存的分配(附详细代码例子)

文章目录

  • 前言
  • 一.malloc
  • 二.free
  • 三.calloc
  • 四.realloc
  • 总结


前言

在C语言中,我们开辟内存的方式有两种

1.静态开辟内存
2.动态开辟内存

静态例:

   int a[10] = {0} ;

我们这里定义的数组所开辟的内存是在栈区中开辟的,数组a指定为40个字节 ,这种分配固定大小的内存分配称为静态内存分配。
在很多时候,我们申请的空间是未知的

比如说通讯录,我们不知道需要存下多少个号码,这时候就存在一个问题,你定的空间需要多少个字节,当申请的太少,就会出现存不下去的情况,如果存的空间过大,有会造成空间的浪费。

而动态内存分配的空间是在堆区申请的,可以控制内存的分配的。两者互有利弊,具体要看所需情况使用~

这里补充一个知识:

内存在使用内存的时候,会划分出不同的功能区域:栈区、堆区、静态区
下面简单画个草图方便大家理解

C语言动态内存的分配(附详细代码例子)_第1张图片
下面让我们看看动态开辟空间几个函数的各自特点和用法。


一.malloc

void* malloc (size_t size);
头文件都是#include
C语言动态内存的分配(附详细代码例子)_第2张图片
在这里插入图片描述
上面是malloc的英文文档,笔者平时看的比较少,但是很建议大家多去看看

下面用中文来解释一下:

1.malloc()函数会向堆中申请一片可用的内存块,若申请成功则返回指向该块开头的指针
2.若申请失败,则会返回NULL空指针, 所以我们在用malloc()函数开辟动态内存之后, 一定要判断函数返回值是否为空.
3.返回值的类型为void*,可强制转化成我们所需类型 如: (int*)malloc(sizeof(int)*n)。
4.如果size为0, 这是未定义的, 会发生未知错误, 可能为空也可能不为空,取决于编译器

例(指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)

	int *p = NULL;
	int n = 50;//此处n可以改成由用户输入任意数字
	p = (int *)malloc(sizeof(int)*n);

二.free

作用:释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。(如果我们不手动释放, 直到程序运行结束才会释放, 这样就可能会造成内存泄漏,我们申请的动态内存不再使用时 ,一定要及时释放)
注:使用后该指针变量一定要重新指向NULL且不能重复释放
否则会出现内存错误。

	int *p = (int *)malloc(sizeof(int));
	*p = 100;
	free(p);
	p = NULL;

三.calloc

void * calloc(size_t num,size_t size)
这里我就不放英文文档了,有兴趣的铁汁们可以下去自己查阅。

calloc()与malloc()函数的区别只在于, calloc()函数会在返回地址之前将其所有位初始化为零,而malloc不初始化,里边数据是随机的垃圾数据.
calloc()函数功能是动态分配num个大小(字节长度)为size的内存空间


C语言动态内存的分配(附详细代码例子)_第3张图片


四.realloc

void * realloc(void * ptr,size_t size)
realloc() 函数就可以对动态开辟内存大小进行调整(可大可小)

1.ptr为需要调整的内存地址
2.size为调整后需要的字节数
3.若调整完成, 指向调整后内存的指针, 若失败,则返回NULL。
4.如果ptr是空指针, 会发生未知错误, 可能为空也可能不为空,取决于编译器

对于realloc扩容时有两种情况
C语言动态内存的分配(附详细代码例子)_第4张图片

第一种情况地址不变。第二种是在新地址申请空间,地址改变。
若不成功,ptr 所指内存不会被释放, 函数返回NULL

C语言动态内存的分配(附详细代码例子)_第5张图片


总结

以上就是对动态内存分配的几个函数的解释和运用,这些在通讯录以及链表中都有用到。若有错误和不足之处请铁汁们指出
最后祝大家学有所成!再见咯大家~
C语言动态内存的分配(附详细代码例子)_第6张图片

你可能感兴趣的:(C语言,c语言,c++,开发语言)