C语言中的内存是如何分配

内存分配简画

在这里插入图片描述
在这里插入图片描述

动态内存分配

1、数组在栈上开辟空间,数组的下标必须是常量,也就是确定值。数组的大小在编译过程中就已经确定了,使用内存时只有在运行中才能确定需要多少。
2、
(1)空间在不同需求下,可能需要不断调整空间大小,导致代码的可扩展性下降;
(2)有可能因为空间划分不合理可能导致空间浪费;
(3)一般在栈上,能有一次有效分配的空间是有限的;
所以我们需要“动态内存管理”:
(1)让我们能够在程序运行期间来决定开辟空间的大小;
(2)有效使用空间,满足不同需求;
(3)堆空间大于栈空间。
3、
*动态内存管理 — 堆空间
void malloc (size_t , size):在堆上申请空间(空间连续)

栈空间:自动申请自动释放;不需要用户进行内存管理
堆空间:需要程序员自己申请(malloc),需要程序员自己释放(free)

注意:
在这里插入图片描述
如果malloc 之后没有 free 空间 ----- 内存泄漏
内存泄漏会导致系统可用内存减少
4、malloc — free 申请的空间是连续的;只申请空间不对空间做任何初始化要求(起始空间内容为随机值)
calloc ---- free 申请空间会进行初始化

一般实际申请空间大小使要稍微大于所需要的内存空间大小,多出来的空间不是给用户用的,是给系统进行管理的

一个指针指向一段没有使用权限的空间,这样的指针—野指针

5、realloc 调整空间
扩展:直接扩展(后边有足够空间可以使用);重新申请,返回新地址(后边空间被占用时)
收缩:直接收缩

relloc 之后,使用时候使用的是realloc 之后的新地址,free 的也是新地址,之前老的地址不会在被使用或free

空间申请有可能申请不成功,因此使用之前要先进行判空
只有堆空间需要 free

char *p=realloc(old,1000)
if(NULL==p){                //判断空间是否申请成功
perror("realloc");
return 1;
}
old=p;                   
//在旧的空间基础上进行扩大,不会影响原本空间的内容
free(p);                //及时释放空间
void GetMemory(char **p,int num)
{
*p=(char *)malloc(num);
}
void Test(void)
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
printf(str);
}

利用二级指针获取函数内部动态内存空间

6、柔性数组:(结构体中若需要一个变长数组)
在struct 里边;
一定是最后一个元素;
元素个数为0;
柔性数组名代表的数组,本身不占结构体大小。

struct A{
int num;
char arr[0];      //柔性数组
}

存在价值:能够帮助程序员实现一个结构体内的变长数组;

(说明:博客内容为原创,有问题可以留言哦~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值