C语言第十课

主要内容:程序存储区的划分、动态申请内存、内存操作函数

一、程序存储区的划分


       栈区:内存地址最大,先进后出,开辟出空间后不能自己释放


       堆区:内存空间最大,malloc等内存分配函数分配的内存(手动申请,手动释放)


       全局区(静态区):存放全局变量的区,在任何变量的前面加static,该变量就会被放入静态区,并且该变量只能

                                        被初始化一次,只有程序退出才释放(永远存在)


       常量区:存放常量的(常量占用内存,为可读状态,不能被修改,否则运行崩溃)


       代码区:所有的语句编译后生成的CPU指令存储到代码区


       内存地址从高到低,内存空间最大的时堆区


二、堆内存分配函数

       malloc()内存分配函数

       手动申请内存空间,不会主动把空间清0,内存中的初始值可能不是0

       特点:效率高,不安全

       示例:

                int  *arr  = malloc(sizeof(int)*  4);/ /  手动申请内存

                free(arr);/ / 释放内存(释放方式是:标记删除)

                手动申请4个整型大小的内存

                int  *arr1 = malloc(4);/ / 可以存放一个int类型的元素

                short  *arr2 = malloc(4);/ / 可以存放两个short类型的元素

                calloc()内存分配函数

                手动申请内存空间,并且会主动把空间清0

                特点:效率低,安全

       示例:

                int  *arr = calloc(sizeof(int)* 4)/ / 手动申请4个整型大小的内存,并且初始值全部清0

                free(arr);/ / 释放内存

                relloc()内存分配函数

                感觉原来分配的空间不够用,重新申请分配内存

                一般都是从小往大了申请,不建议从大往小了申请(容易丢失数据)

       示例:

                int  *arr = malloc(sizeof(int)* 4);/ / 申请内存

                realloc(arr,10);/ / 重新申请内存

                free(arr);/ / 释放内存

三、内存操作函数

       memset()

       初始化内存void  memset(void *s,int c,size_t n)

       从s指向的内存开始初始化n个字节的内容为c

       示例:

                char  *name = malloc(sizeof(char)*10);/ /申请内存

                memset(name,' a ',10);/ / name从哪里开始初始化

                                                                 / / 初始化的内容

                                                                 / / 长度

                free(name);/ / 释放内存

        memcpy()

        内存拷贝void  mescpy (void  dest,const  void  source,size_t n)

        从source指向的内存开始拷贝到dest,拷贝n个字节

        示例:

                 char  *name1 = malloc(sizeof(char)* 10);/ / 申请内存

                 memcpy(" iPhone ",name1,3);/ / 执行拷贝

                 free(name1);/ / 释放内存

                 free(name2);/ /释放内存

        memcmp()

        内存比较int  memcmp(const  void  *buf1,const  void  *buf2,unsigned  int  count);

        比较buf1和buf2指向的内存是否相同,比较count个字节

        示例:

                 char  *arr1 = malloc(sizeof(char)*5);

                 char  *arr2 = malloc(sizeof(char)*5);

                 arr1 = " iPhone ";

                 arr2 = " iPad ";

                 int  result  =  memcmp(arr1,arr2);

                 printf(" %d ", result); 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值