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释放空间是个好习惯

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页名称:C语言动态内存管理(malloc函数,动态数组)-创新互联
文章路径:http://hbruida.cn/article/dcjeio.html