运维开发网

C语言中动态内存管理

运维开发网 https://www.qedev.com 2022-09-21 17:37 出处:网络
动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存

动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存


一、为什么存在动态内存分配

在C语言中,目前我们有以下几种内存开发方法:

int val = 20;//在栈空间上开辟四个字节char arr = {0};//在栈空间上开辟10个字节的连续空间

创建一个变量或数组。
这样开辟出来的空房间在我们使用时有时会出现,要么空房间太大,要么空房间太小,不够灵活。
所以我们需要一种方法让空之间的空间变大变小。这时,动态内存打开出现。

不过上面提到的开空的方式有两个特点:

1.空之间的间隙大小是固定的。

2.在声明数组时,必须指定数组的长度,并且在编译时分配它需要的内存。但是,对空的需求不仅仅是上述情况。有时候我们需要的空的大小要在程序运行时才能知道,所以编译数组时创建空的方式就不能满足。这个时候,我们只能尝试动态存储。


二、动态内存函数的使用

首先,我们需要知道数据、变量和函数是如何存储在内存中的,如下图所示:


[10]

1.malloc函数


(1)malloc的定义


这个函数适用于内存中连续可用的空空间,并返回指向这个空空间的指针。


(2)malloc函数的注意事项

1.如果打开成功,返回一个指向打开的空空间的指针。

2.如果开拓失败,则返回一个空指针,因此必须检查malloc的返回值。

3.返回值的类型是void*,所以malloc函数不知道空之间的类型,使用时由用户决定。

4.如果参数大小为0,malloc的行为是标准的和未定义的,这取决于编译器。


(3)malloc函数的使用

代码如下:

#includelt;stdio.hgt; //动态内存开辟int main(){//假设开十个整型的空间 -- 10*sizeof(int)int arr[10];//栈区//动态内存开辟int* p = (int*)malloc(10 * sizeof(int));//使用这些空间的时候if (p == NULL){perror("main");//main:xxxxxxxxxxx(错误信息)}//使用int i = 0;for (i = 0; i lt; 10; i++){*(p + i) = i;}for (i = 0; i lt; 10; i++){printf("%d", p[i]);//p[i]--gt;*(p + i)}//回收空间free(p);//malloc函数要配合free函数使用,使用完之后要主动释放这块空间p = NULL;//释放完了之后要把p置成空指针return 0;}


2.calloc函数


(1)calloc函数的定义

c语言还提供了一个名为calloc的函数,也用于动态内存分配。



(2)calloc函数的注意事项

1.函数的作用是为num个有大小的元素打开一个空空间,并将空空间中的每个字节初始化为0。

2.与malloc函数的区别在于calloc会在返回地址之前将requested 空中的每个字节初始化为全0。


(3)calloc函数的使用

代码如下:

#includelt;stdio.hgt; //动态内存开辟int main(){ int* p = calloc(10,sizeof(int));//使用这些空间的时候if (p == NULL){return 1;}int i = 0;for (i = 0; i lt; 10; i++){printf("%d", p[i]);//p[i]--gt;*(p + i)}//回收空间free(p);//malloc函数要配合free函数使用,使用完之后要主动释放这块空间p = NULL;//释放完了之后要把p置成空指针return 0;}

打印结果如下:


需要注意的是,calloc函数和malloc函数有两个区别。

1.1.calloc函数有两个参数,malloc函数有一个参数。

2.如果2.malloc函数没有初始化,所有打印出来的值都是随机的,calloc函数不需要初始化。默认情况下,它会将应用的空中的每个字节初始化为0。


3.realloc函数


(1)realloc函数的定义

realloc函数的出现使得动态内存管理更加灵活。

有时候我们发现自己过去申请的空房太小,有时候又觉得自己申请的空房太大。所以,为了合理的时间记忆,我们会对内存大小进行灵活的调整。

然后realloc函数可以调整动态打开的内存大小。



(2)realloc函数的注意事项

1.ptr是要调整的内存地址。

2.尺寸调整后新尺寸的返回值是调整后的记忆开始位置。

3.该功能在调整原内存空大小的基础上,还会将原内存中的数据移动到新内存空中。

4.4.realloc调整内存空有两种情况:

1情况1,要扩展内存,直接在原内存中添加空,原空中的数据不会改变。

2情况2,当原来的空房间后没有足够的空房间时,扩展的方法是在堆空房间上再找一个合适大小的连续空房间使用。这个函数返回一个新的内存地址。由于以上两种情况,realloc函数的使用要注意一些。


(3)realloc函数的使用#includelt;stdio.hgt; //动态内存开辟int main(){ int* p = calloc(10,sizeof(int));//使用这些空间的时候if (p == NULL){perror("main");return 1;}int i = 0;for (i = 0; i lt; 10; i++){*(p + i) = 5;}//这里需要P指向的空间更大,需要20个int空间的大小//realloc调整空间大小int* ptr = realloc(p, 20 * sizeof(int*));if (ptr != NULL){p = ptr;}//回收空间free(p);//malloc函数要配合free函数使用,使用完之后要主动释放这块空间p = NULL;//释放完了之后要把p置成空指针return 0;}


总结

本文简单介绍动态内存函数的定义、注意事项和使用方法,free函数用于释放动态内存打开的空房间,然后设置为空。文章如有疑问,欢迎提问。我会虚心学习改正,最重要的是共同进步成长,学好编程。

关于C语言中动态内存管理malloc calloc realloc free函数的介绍本文到此结束。关于C语言动态内存管理的更多信息,请搜索源搜网之前的文章或者继续浏览下面的相关文章。

0

精彩评论

暂无评论...
验证码 换一张
取 消