当前位置: 代码迷 >> 综合 >> 指针和动态内存——malloc calloc realloc free
  详细解决方案

指针和动态内存——malloc calloc realloc free

热度:36   发布时间:2023-12-05 23:01:10.0

1、malloc

void* p=malloc(size_t size)

eg:void *p=malloc(3*sizeof(int))

括号里面的参数为:单元的数量*每个单元的字节数

malloc返回的一个void指针,无法直接解引用(不能解引用一个void指针)

通常我们需要把它转换成一个特定类型指针:

int *p=(int *)malloc(3*sizeof(int))             //创建了一个含有三个元素的数组

print p

*p=2;

*(p+1)=3;

*(p+2)=6;

2、calloc

void* calloc(size_t num,size_t size)

eg:int *p=(int *)calloc(3,sizeof(int))

与malloc区别:

(1)calloc接受两个参数,第一个参数是数量,第二个参数是类型大小

(2)malloc分配完内存后,不会对前期进行初始化,如果没有填入值,会得到一些垃圾

而calloc会初始化为0

让我们写一个程序来验证第二个区别:

#include<stdio.h>
#include<stdlib.h>int main()
{int n;printf("enter the size of the array:");scanf("%d",&n);int *A=(int*)malloc(n*sizeof(int));
//    int *A=(int*)calloc(n,sizeof(int));for(int i=0;i<n;i++)printf("%d ",A[i]);return 0;
}
//把赋值for语句注释掉,可以用于检验malloc和calloc的初始化区别
//malloc不会进行初始化,输出的是垃圾
//calloc会进行初始化为0,输出的是0
//将以上两行等价语句分别注释,用于检验

3、realloc

void* realloc(void* ptr,size_t size)

使用方法:有一块内存,动态分配的内存,想修改内存块大小。

第一个参数表示已分配的起始地址的指针,第二个参数代表新的内存快大小

(应用于不同的场景)

eg:

int *B=(int*)realloc(A,2*n*sizeof(int));

这个函数会请求一个新的大小是2n的内存,然后把之前那个内存块的内容拷贝过去,如果新的内存块大小更大,如果可以扩展之前的块,如果能在之前的块的基础上找到连续的内存,那么扩展之前的块,否则分配新的内存。把之前的块的内容拷贝过去,然后释放之前的内存。

让我们来看看一个realloc的使用例子:

#include<stdio.h>
#include<stdlib.h>int main()
{int n;printf("enter the size of the array:");scanf("%d",&n);int *A=(int*)malloc(n*sizeof(int));//int *A=(int*)calloc(n,sizeof(int));for(int i=0;i<n;i++)A[i]=i+1;int *B=(int*)realloc(A,(n/2)*sizeof(int));printf("prev address:%d,\nnew address:%d\n",A,B);for(int i=0;i<n;i++)printf("%d ",B[i]);return 0;
}

4、free

free用于释放调用的内存

比如:

#include<stdio.h>
#include<stdlib.h>int main()
{int n;printf("enter the size of the array:");scanf("%d",&n);int *A=(int*)malloc(n*sizeof(int));//如果calloc:int *A=(int*)calloc(n,sizeof(int));for(int i=0;i<n;i++)A[i]=i+1;A[1]=10;free (A);//加上free语句释放内存(销毁数据),输出的全是随机值,for(int i=0;i<n;i++)printf("%d ",A[i]);return 0;
}

这时我们运行会出现什么呢?

 

 当我们在free函数后面重新加上一个赋值语句:

#include<stdio.h>
#include<stdlib.h>int main()
{int n;printf("enter the size of the array:");scanf("%d",&n);int *A=(int*)malloc(n*sizeof(int));//如果calloc:int *A=(int*)calloc(n,sizeof(int));for(int i=0;i<n;i++)A[i]=i+1;A[1]=10;free (A);//加上free语句释放内存(销毁数据),输出的全是随机值,A[2]=2;  //重新赋值,则重新调用内存for(int i=0;i<n;i++)printf("%d ",A[i]);return 0;
}

这时运行:

 我们可以看到,数组A[2]被重新赋值

以上就是关于指针和动态内存的四个函数的内容了。