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

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]被重新赋值

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值