龙空技术网

嵌入式Linux开发《C语言专题(五:(3)实用的内存函数5)》

嵌入式软硬件开发 241

前言:

而今各位老铁们对“c语言申请内存的函数”大约比较讲究,朋友们都需要了解一些“c语言申请内存的函数”的相关资讯。那么小编同时在网络上搜集了一些有关“c语言申请内存的函数””的相关资讯,希望姐妹们能喜欢,朋友们快快来学习一下吧!

在文章嵌入式Linux开发《C语言专题(五:(3)实用的内存函数4)》中对C语言中内存操作函数做了部分介绍,这篇文章将继续介绍部分操作动态内存函数malloc和free。这些内存函数看着简单,但是一不小心就会出错。关于动态内存这一块是重点,在实际的研发和面试题中有很多“陷阱”。因此学会正确使用动态内存函数和知道如何识别并且避免这些“陷阱”是本片文章和后续文章的主要内容。

头文件都是:#include <stdlib.h>

在写之前,先提问几个问题:什么是动态内存分配?什么是静态内存分配?动态内存分配和静态内存分配的区别和联系?

(1)什么是动态内存分配?

答:字面意思是所要的内存是动态分配的,这些内存空间在代码执行时是根据外部的条件分配所需的内存空间,是可以变化的,也就比较灵活。

(2)什么是静态内存分配?

答:字面意思是所要的内存是静态分配的,比如我们常在代码中定义固定大小的数组,int a[20] 这20个元素存储在内存中的连续位置,数组所占的内存大小是在编译时决定的,一旦代码执行后,这个数组的大小就固定了,不能再更改。

(3)动态内存分配和静态内存分配的区别和联系?

答:联系-都是用来申请内存空间 区别-动态内存分配是从堆上分配的,而静态内存分配不是从堆上分配,可以是栈或者静态存储区等(具体什么是堆,什么是栈,什么是静态存储区不再这里介绍)。是相对对方来说的,没有优劣之分,都有自己的应用场景。比如在下位机和上位机之间的通信协议规定好必须传输固定字节个数,那么这时候用静态内存分配就可以;比如根据外部学生的个数来激励学生的成绩,因为学生个数不定,那么这时候就可以用动态内存分配来解决。所以我们在做研发时要根据实际的应用场景来选择相应的内存分配方式。

(4)malloc :动态申请内存空间,不过申请的内存没有被初始化也即内存时“脏的”

函数名:malloc

函数原型:void *malloc(size_t size);

函数参数:size:以字节为单位申请的内存大小

头文件: #include <stdlib.h>

功能:动态申请内存空间,不过申请的内存没有被初始化也即内存时“脏的”

返回值:成功返回执行分配内存的地址 失败返回NULL

说明:当malloc(0)也可能返回NULL或者是一个独特的指针,这个指针随后传递给free。实

际开发中malloc(0)是无意义的。

(5)free:释放申请的内存空间

函数名:free

函数原型:void free(void *ptr);

函数参数:ptr:所申请的内存空间的地址

头文件: #include <stdlib.h>

功能:释放申请的内存空间

返回值:无

说明:如果在free之前已经执行过free操作,那么再次free时可能会有异常情况发生。如果

参数ptr是NULL,那么free(NULL)相当于什么也没有操作。

malloc所分配的是一块连续的内存,类似于数组的存储方式;并且申请的内存空间没有被初始化。因为malloc的返回值是void *类型,因此并不知道所申请的内存时用来存储哪些数据类型 比如整形、浮点型、结构体、数组等。但是void *可以是任意的指针类型,为了便于清晰的展示出我们所申请的内存空间用于存储哪些数据类型,最后加上强制类型转换,比如申请的内存空间存储整数就可以转换成整型:(int *)malloc(实际的内存大小);对于边界要求限制的数据类型,malloc也能满足。

(6)malloc和free的使用步骤:

1)用malloc申请所需的内存空间,在申请时注意sizeof关键字的使用以及强制类型转换

2)检查malloc返回值,注意NULL放到等号的前面

3)如果返回值不为NULL,则使用申请的内存空间;如果不正确,进行出错提示或者退出程

4)释放申请的内存空间,并将申请内存空间返回的指针设置为NULL

代码演示:#include <stdio.h>//一定要加上操作头文件#include <stdlib.h> #define NUMBER 4//演示malloc和free内存操作int main(int argc, char** argv){	int i = 0;	int *p = NULL;	//第一步:申请内存空间	p = (int *)malloc(sizeof(int) * NUMBER);	//第二步:检查返回值	if(NULL == p)	{		printf("申请内存空间出错\n");		//如果出错,退出整个进程		exit(-1); 	}	//第三步:使用内存空间	for(i=0; i<NUMBER; i++)	{		//将所申请的内存空间赋值为0		p[i] = 0;		printf("p[%d] = %d \n", i, p[i]);	}	//第四步:释放内存空间	free(p);	p = NULL;		return 0;	}//运行结果://p[0] = 0 //p[1] = 0 //p[2] = 0 //p[3] = 0 

上面这个代码是展示如何正确使用malloc和free,但是在面试题或者研发时对使用它们有很多的“陷阱”,一不小心可能就“陷”进去了。总结了以下常见的"陷阱",大家也可以自己先写代码测试这些陷阱,后面文章将一一剖析这些“陷阱”。

1)malloc(0)真的是申请0空间吗?malloc(100)呢?

2)malloc 多次free 1次 或者malloc 1次 free多次?

3)没有检查内存分配是否成功?

4)使用申请的动态内存时超出了申请的内存边界?

5)释放一部分内存空间?

6)试图访问已经释放的内存?

未完待续,后续继续更新内存函数具体用法...

更多精彩内容可以关注此头条号:嵌入式软硬件开发 喜欢的话大家可以“评论”,“转发”、“点赞”或者“收藏”,感谢大家。相互交流,共同成长。

标签: #c语言申请内存的函数 #c语言申请内存的函数是什么