C语言-->(十五)动态内存分配

知识点:
动态内存管理
1.数据在内存中的存储
2.内存分配malloc
3.free函数使用
4.堆和栈的区别 heap stack
5.常用内存操作函数
==============================
内存使用
1.回顾函数在使用时候所开辟的内存栈(swap函数)
2.变量所在的内存空间
3.栈空间的限制 stack
1)栈大小:一般在2M左右
练习: 测试自己系统栈空间的大小 64位系统内存空间

4.栈数据的特点
1)回顾局部变量的生命周期
2)每个变量的内存大小均在编译时候确定,空间由操作系统分配
3)数据由系统自动释放
4)数据分配在栈段
思考:

1.是否可以返回函数执行过程中局部变量的内存地址
2.如果需要的内存栈无法提供足够的内存容纳我们的数据怎么办
3.如果需要将函数内的数据保存到程序结束再销毁,是否可以

5.堆空间的使用 heap
1)堆空间的特点
1>大小由程序员决定,空间由程序员分配
2>大小在运行时候确定
3>由程序员手动释放
4>数据分配在堆段


==============================
动态内存分配函数
1.malloc 内存分配
1)函数原型
void * malloc(size_t size)

2)函数使用
malloc(size);

3)分配内存注意
1)函数执行完后如果成功,返回该size大小内存的首地址
2)函数执行失败返回NULL
3)malloc会在堆上寻找一块size个字节的内存返回给用户
4)使用之前一定要判断是否分配成功,因为malloc函数执行有可能会失败(内存不足)
1.内存不足
2.没有足够大的连续内存空间


练习:
1.分配一能足够保存double数据的内存空间,并且赋值输出

2.分配一个足够保存10个double类型数据的内存空间,并且赋值输出



================================
内存释放函数
思考:申请的内存是否需要释放,不释放是否可以,会造成怎样的结果
1.free 内存释放
1)函数原型
void free(void *ptr)
2)函数使用
free(ptr)
3)函数使用注意
思考:释放后的内存是否可以继续使用

1>只能对有效分配的内存进行释放
思考: 被释放的内存还可以引用吗
2>思考:如果对一个指针连续释放两次会如何
3>不能释放栈上的空间
4>如何避免上述情况
练习:释放malloc


================================
堆和栈的区别
1.分配大小
栈 不能超过8M (系统相关)
堆 可以任意分配,只要系统有内存
2.分配速度
栈 快
堆 慢


===============================
数据在内存中的存储与分布
1.数据区:栈,堆,数据段
2.栈
1)由编译器自动分配和释放,进入函数时分配空间,函数结束时释放空间
2)存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成
3)此段中的初始值均为随机数
3.堆
1)一般由程序员手动申请以及释放, 若程序员不释放,程序结束时可能由OS回收 。malloc申请,free释放
2)初始值均为随机数
4.数据段
1)BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。
2)数据段:存放的是初始化后的全局变量和静态变量。
3)文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放空间(只读静态存储取) rodata
4)程序代码区(文本区):存放函数体的二进制代码
UNIX下可使用size命令查看可执行文件的段大小信息。如size a.out

 

================================
常用内存处理函数
1.memset 将ptr所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值
1)函数原型
void * memset(void *ptr, int c, size_t len)
2)函数使用
3)函数使用注意
练习:分配10个字节的内存空间
1.输出该空间中的内容
2.将该内存空间上的内容全部设置为1
2.memcpy 内存拷贝,从s2拷贝len的字节内容到s1中
1)函数原型
void *memcpy(void *dst, const void *src, size_t len)

2)函数使用
3)函数使用注意

 

memcpy与strcpy函数的区别
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,
而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。
memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
===========================================

 

转载于:https://www.cnblogs.com/iOSteemo/p/4304490.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值