动态内存管理

函数快查 - 《带你学C带你飞》系列教程对应课后作业|扩展练习|案例解读|扩展阅读 - Powered by Discuz! (fishc.com.cn)

malloc:申请动态内存空间

函数原型:void *malloc(size_t size);(返回的void指针可以强转成任意类型指针)

malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针。

如果函数调用成功,返回一个指向申请的内存空间的指针,由于返回类型是void指针,所以它可以被转乘任何类型数据。如果函数调用失败,返回值NULL。另外size参数设置为0,返回值也可能是NULL,但这并不意味着函数调用失败。

#include<stdio.h>
#include<stdlib.h>
int main()
{
        int *ptr;
        ptr=(int *)malloc(sizeof(int));
        if(ptr == NULL)
        {
                printf("failed\n");
                exit(-1);
        }
        printf("please input a num:\n");
        scanf("%d",ptr);
        printf("num=%d\n",*ptr);
        return 0;
}

运行结果:

lhy@ubuntu:~/xiaojiayu$ gcc p37-1.c 
lhy@ubuntu:~/xiaojiayu$ ./a.out 
please input a num:
66
num=66

用malloc申请的空间是在堆上面的,要我们主动使用free函数去释放这空间资源,不然可能会导致内存泄露。

malloc还可以申请一块任意大小的内存空间。

#include <stdio.h>
#include <stdlib.h>
int main()
{
        int i;
        int num;
        int *ptr=NULL;
        printf("please input num:\n");
        scanf("%d",&num);
        ptr=(int *)malloc(num*sizeof(int));
        if(ptr == NULL)
        {
                exit(-1);
        }
        for(i=0;i<num;i++)
        {
                printf("please input %d number:",i+1);
                scanf("%d",&ptr[i]);
        }
        printf("this is you input numbers:\n");
        for(i=0;i<num;i++)
        {
                printf("%d\n",ptr[i]);
        }
        free(ptr);
        return 0;
}

运行结果:

please input num:
6
please input 1 number:33
please input 2 number:66
please input 3 number:97
please input 4 number:89
please input 5 number:12
please input 6 number:63
this is you input numbers:
33
66
97
89
12
63

free:释放动态内存空间

#include<stdio.h>
#include<stdlib.h>
int main()
{
        int *ptr;
        ptr=(int *)malloc(sizeof(int));
        if(ptr == NULL)
        {
                printf("failed\n");
                exit(-1);
        }
        printf("please input a num:\n");
        scanf("%d",ptr);
        printf("num=%d\n",*ptr);
        free(ptr);
        printf("num=%d\n",*ptr);
        return 0;
}

运行结果:

lhy@ubuntu:~/xiaojiayu$ ./a.out 
please input a num:
99
num=99
num=0

calloc:申请并初始化一系列内存空间

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
        int *ptr1=NULL;
        int *ptr2=NULL;

        //第一次申请的内存空间
        ptr1=(int *)malloc(10*sizeof(int));
        //进行若干操作之后发现ptr1申请的内存空间竟然不够用
        //第二次申请内存空间
        ptr2=(int *)malloc(20*sizeof(int));
        //将ptr1的数据拷贝到ptr2
        memcpy(ptr2,ptr1,10);
        free(ptr1);
        //对ptr2申请的内存空间进行若干操作
        free(ptr2);
        return 0;
}

realloc:重新分配内存空间

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
        int i;
        int num;
        int count=0;
        int *ptr=NULL;//此处必须初始化为NULL
        do
        {
                printf("please input a number,-1 is end:\n");
                scanf("%d",&num);
                count++;
                ptr=(int *)realloc(ptr,count*sizeof(int));
                if(ptr == NULL)
                {
                        exit(1);
                }
                ptr[count-1]=num;
        }while(num != -1);
        printf("input numbers is::\n");
        for(i=0;i<count;i++)
        {
                printf("%d ",ptr[i]);
        }
        printf("\n");
        free(ptr);
        return 0;
}

运行结果:

lhy@ubuntu:~/xiaojiayu$ gcc p38-3.c 
lhy@ubuntu:~/xiaojiayu$ ./a.out 
please input a number,-1 is end:
36
please input a number,-1 is end:
96
please input a number,-1 is end:
56
please input a number,-1 is end:
55
please input a number,-1 is end:
66
please input a number,-1 is end:
52
please input a number,-1 is end:
87
please input a number,-1 is end:
89
please input a number,-1 is end:
-1
input numbers is::
36 96 56 55 66 52 87 89 -1

更详细的可参考:​​​​​​​C语言进阶(七)——动态内存管理_rain67的博客-CSDN博客

内存泄露:

#include<stdio.h>
#include<stdlib.h>
int main()
{
        int a=123;
        int *ptr;

        ptr=(int *)malloc(sizeof(int));

        if(ptr == NULL)
        {
                printf("failed\n");
                exit(-1);
        }

        printf("please input a num:\n");
        scanf("%d",ptr);

        printf("num=%d\n",*ptr);

        ptr=&a;
        printf("num=%d\n",*ptr);

        free(ptr);

        return 0;
}

 运行结果:

lhy@ubuntu:~/xiaojiayu$ ./a.out 
please input a num:
33
num=33
num=123
munmap_chunk(): invalid pointer
Aborted (core dumped)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值