c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。

前言:

在c语言的编程中,各种不同位置,不同定义方式出的数据被放置在不同的区域,栈区,静态区,以及堆区。下面我们通过一张图表来了解一下数据都被存储在什么区域。

c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。_第1张图片

这里我们就不对栈区和静态区的数据进行过多的讨论了,我们直接来看堆区的”变量“(实则是一块被申请的空间)

一:malloc,free 函数的基本介绍

c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。_第2张图片

一般申请的空间较小时,不会申请失败。

下面我们来看一个向内存申请空间的简单例子:

c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。_第3张图片

    int *pa = (int*)malloc(4);

     向堆区申请4个字节的空间,并且将malloc函数的返回值强制类型转换成int类型的指针         后,将这块申请好的空间交给int类型的指针pa去维护。

在使用完这块空间后,要对这块存在于堆区的空间进行手动释放。

free(pa);

将pa指向的那块空间的地址传递给free函数,free函数会自己去释放那块空间。

pa = NULL;

虽然已经将那块空间释放但是指针pa中依然存放那块空间的地址,为了后续的代码中的安全,我们也要手动将pa置NULL。

以上就是一个基本的堆区空间的使用方式。

二:calloc函数的简介

c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。_第4张图片

就像申请数组一样,需要元素的个数,和每一个元素的大小,而且申请的空间也是像数组那样连续的 ,在访问时也可以像使用数组那样。

基本使用方式于malloc一致,只有这里的一个函数参数不同而已。

访问如下:

c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。_第5张图片

三:realloc函数简介

realloc:修改malloc和calloc函数在堆区开辟的空间的大小,通过前面对malloc和calloc函数的介绍,我们了解了如何向堆区申请空间,但是在对内存进行使用时,如果所申请的空间是固定的,那么这些在堆区中申请的空间和函数直接在栈区申请的空间没什么太大的区别了。

c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。_第6张图片

c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。_第7张图片

 在使用realloc函数重新申请空间时,也可能会申请失败,所以判断一些如果返回NULL(申请失败)那就不要将ptr赋值给pc了,这样会让pc失去原本的地址。

那么realloc是如何修改空间的呢??????

这里分两种情况

c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。_第8张图片

假设堆区中现在存在两个动态开辟的空间,分别给p1和p2维护,假设p1和p2中间相差4个字节,现在需要将p1指向的空间扩容

第一种:如果扩容的大小小于等于4字节,那么realloc函数会直接在原来的位置扩容。

第二种:扩容的大小大于4个字节,那么realloc函数会直接在堆区新的位置,开辟一块空间,并且将原来位置的数据复制过来。

当然realloc函数也可以直接开辟空间,那就是在realloc函数第一个参数位置传递NULL。

int* pc = (int*)malloc( 4);             int* pa = (int*)realloc(NULL, 4);

这两种开辟空间的方式完全等价。

你可能感兴趣的:(指针,动态内存开辟,c语言,开发语言)