零基础C语言学习(动态内容分配)

                 *c语言学习笔记(二十一)*

动态内存分配(重点)

一、内存的种类:
1、栈区:局部变量,函数的形参
2、堆区;动态内存分配
3、静态区:全局变量,静态变量
常创建变量或者数组的时候,在内存中开辟的空间都是固定的,比如数组必须用常数来指明数组内容长度。
所以为了克服上面的缺点,就有了动态内存分配:(在堆内开辟)
二、动态内存分配函数:
1、malloc函数:
使用malloc函数开辟动态空间,函数的格式为:void*malloc(size)
此函数会开辟一段存储空间,并返回一个空类型的地址指针,我们可以按着数据类型进行强制转换,否则可能会报错。
例:

int* p =(int*) malloc(10 * 4)

malloc函数若开辟内存空间超过了允许范围,则会返回一个NULL值。
若size为0,标准未定义,因此取决于编译器的决定;尽量不要写0
2、free函数:
当系统创建动态空间而没有使用时,很显然造成了浪费,此时需要对空间进行回收。
假设对上述的空间进行回收:

free(p);
p = NULL;

注意程序不结束不要运行回收函数,所以free应当写在程序的结尾处。并且将p改成空指针(清空联系)。malloc和free函数要成对使用
只有动态开辟的内存才可以使用free函数进行释放。
3、calloc函数:
开辟一个数组的空间

int*p=(int*) calloc(10, 4);

其中括号内第一个数字为数组内元素个数,第二个数字为每个元素所占的字节数,上面语句开辟了一个包含是个整型元素的数组空间。
同时,若空间不再允许范围内,calloc也会返回一个NULL;
回收时,仍然用free函数。
calloc的特点是开辟空间时,会自动将内容初始化为0。
4、realloc函数:
realloc函数让动态内存的使用更加灵活;realloc可以调整动态内存开辟空间的大小,可以进行补充或者去除。
使用格式:

int* pb = (int*)realloc(p, 80);

将开头使用malloc函数创建的40字节的空间改为80字节空间。
注:realloc函数在使用时,尽量不要让前后指针名相同,因为在开辟空间时,可能存在空间后续空间不够的情况,因此realloc函数对的返回值地址可能会发生变化。
若原来指针指向的空间不够开辟,则会新开辟一块空间并拷贝旧的空间内容,然后释放旧空间并返回新空间地址。
若调整空间不再允许范围内,则也会返回一个NULL,此时若在原来指针上面直接修改,那么原来的指针就会被改成空指针,原指针也就失效了。
最后也要free空间。
注:malloc函数使用时一定要进行返回值判断,来确定函数是否返回了空指针。(可以使用if语句)
三、指针越界访问
动态内存开辟也要注意指针越界问题

int* p = (int*)malloc(10 * 4);
int i = 0;
for (i = 0; i < 50; i++)
{
	*(p + i) = i;
}

上述程序就导致了指针越界,此时程序进入无反应状态,进程“卡死”了。开辟空间多大,指针访问的范围也就多大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值