内存分配简画
动态内存分配
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]; //柔性数组
}
存在价值:能够帮助程序员实现一个结构体内的变长数组;
(说明:博客内容为原创,有问题可以留言哦~)