C语言动态内存管理(malloc函数,动态数组)

前言:

今天C语言复习的时候发现自己malloc函数不太熟悉 不过也是 学习了c++之后链表都用new函数开链表了 动态数组直接用vector了 学算法又用数组模拟链表了 而且后来大佬们也告诉我 以后基本百分之90的时候没机会用到这个函数 但是考试还是会考滴 所有还是好好复习一下这个函数吧

我们希望得到一个可以控制长度的数组 那么我们下面这样写可以吗

int n;
scanf("%d",&n);
int a[n];

我们这样 就将数组长度定义为了n,你输入多少 数组长度就是多少

但是你发现 这样大部分编译器都是会报错的(老版本的dev c++除外)

因为数组不能用变量定义大小 变长数组已经从C语言标准移除了

申请内存空间

正确的方法 应该是使用头文件stdlib.h中的malloc函数

从内存中申请一段连续的内存空间

函数malloc的原型为

void*malloc(size_t size); size为申请的内存空间大小

如果申请成功 返回值为成功申请的内存的首地址

如果申请失败,返回值为NULL

使用方法如下:

 int *pint = NULL;
 pint = malloc(sizeof(int));
 *pint = 123;

我们申请了4字节的空间(因为int占4字节)

void*类型的返回值通过赋值转化成了int*

C语言中 我们可以通过赋值将void*类型的指针转化为其他类型的指针

但是C++中 void*必须强制转化后 才可以赋值给其他类型的指针

所以为了程序的兼容型 我们一般的写法是:

 int *pint = NULL;
 pint =(*int) malloc(sizeof(int));
 
 double*pdouble=NULL;
 pdouble = (*double) malloc(sizeof(double));

另外 要保证不要使用超过申请的内存大小 会导致程序崩溃 如果申请一个大小为10的数组

两种写法都可以

 int *pint = NULL;
  pint =(*int) malloc(sizeof(int)*10);//第一种
  pint =(*int) malloc(sizeof(int[10]);//第二种

 for(int i = 0;i<10;i++)
    pint[i]=i;//给数组赋值 

之前我们都是默认申请内存成功 如果申请失败了呢?

对NULL指针取值将导致程序崩溃 所有作为一个稳健的程序猿 我们可以加上一个if判断

  #include
  #include
  
  int *pint = NULL;
  pint =(*int) malloc(sizeof(int)*10);
  pint =(*int) malloc(sizeof(int[10]);
  
  if(pint != NULL){
  	*pint = 123;
  	printf("%d",*pint);
  } 

当然 在我们平时刷题的时候基本不会说有申请失败的情况 但如果以后实习或是参加项目啥的最好还是有一个判断语句显得专业一点

释放内存空间

使用头文件stdlib.h中的free函数

free函数原型:void free(void*ptr) 传入申请的内存的首地址

  int *pint = NULL;
  pint =(*int) malloc(sizeof(int)*10);
   
  if(pint != NULL){
  	*pint = 123;
  	printf("%d",*pint);
  	free(pint);
  } 

如果只申请而不释放会怎么样呢?

我们的内存空间会一直保留 直到程序结束 这期间会一直分配空间直到没有剩余空间分配

同时申请的空间地址无法再被使用 我们一般称这种现象为内存泄漏

所以 使用free释放空间是个好习惯

你可能感兴趣的:(C语言基础知识,c语言,链表,数据结构)