动态内存管理(上)
1.为什么会有动态内存管理
我们都知道申请内存有两个方法 ,
1.变量加变量名
如 int a=10;这就向内存内存中申请了四个字节的空间用来存放a的地址。
2.变量名加数组名
如 char arr[10]={0};这就向内存中申请了10个字节的空间用来存放数组arr的地址。
上面这两种方式有一定的局限性,如我们创建了一个int arr[10],后续发现我有30个元素,
这样就存放不了,反之也是一样的道理。但是有些小伙伴初学的时候容易写成下面的代码,
#include<stdio.h> int main() { int a = 0; scanf("%d", &a); int arr[a]; return 0; }
以为做到了想多少输多少,其实是错误的,因为对于数组来说下标必须是常量或常量表达式,否则会报错。
2.内存的存储形式:
3.动态内存函数的介绍 malloc free calloc realloc
—、malloc函数
#include<stdio.h> #include<malloc.h> #include<string.h> #include<errno.h> int main() { int* p=(int*)malloc(40);//强制类型转化成int*,malloc向内存中申请40字节空间 if(p==NULL) { printf("%s",strerror(errno));//打印错误码所对应的错误信息, return 0;//若为空则退出函数 } for(int i=0;i<10;i++) { *(p+i)=i; 赋值 printf("%d ",*(p+i));打印 } free(p);//释放p所指向的空间 p=NULL;//切断p和原来地址的联系 return 0; } ———————————————— **二、free函**数 free函数介绍:1.free函数是专门用来释放动态内存开辟的空间的一的函数,和其他和其他动态内 存申请的函数配套使用(相当于一个去借一个去还)。 2.函数的参数形式void free(void*ptr)其中void*ptr是所要释放的指针 注意:1.如果所释放的指针不是动态内存申请的,那free函数是不会释放的,并且 会导致程序崩溃,所以对于free函数的使用必须是动态内存函数申请的。 2.如果是free(NULL);那么free函数什么也不做,程序也不会报错,此时的 free函数有跟没有是一样的 3.free函数只是释放了*ptr所指向的空间,但还是可以通过*ptr找到当初所 申请的空间,为了防止错乱,应将*ptr=NULL,切断他们的联系。 freed的使用可以看上面写过的代码。 *还有两个下次补充。写作不易,记得支持一下*。 ————————————————