动态内存管理 malloc函数与free函数

你离开我真会死。 提交于 2020-02-20 03:02:02

创建动态内存空间函数malloc:

函数原型:

      - void *malloc(size_t size);

需要头文件<stdlib.h>;

malloc函数向系统中申请分配size个字节的内存空间,并返回一个指向这块空间的指针。

返回值为void类型的原因:因为void是可以转换(赋值)为任意一种类型的,是由于我们申请内存空间的不确定性。

注意:申请的空间没有被初始化为零,所以所申请的空间内的数据是随机的。

如果函数调用成功,返回一个指向申请内存空间的指针,返回类型是void,所以可以被转换为任意类型的数据。

如果函数调用失败,返回值是NULL。如果设置size为0,也有可能返回为NULL,这不代表函数调用的失败。

调用malloc函数的例子:

#include <stdio.h>
#include <stdlib.h> 

int main()
{
	int *ptr;  //定义指针ptr
	
	ptr = (int *)malloc(sizeof(int));  //地址给ptr记载 (int *)可以省略
	if (ptr == NULL)
	{
		printf("分配内存失败!\n");
		exit(1);  //程序退出
	}
	printf("请输入一个整数:");
	scanf("%d",ptr);
	printf("你输入的整数是:%d\n",*ptr); 
	
	return 0;
} 

malloc申请的内存空间是位于堆,如果不主动释放堆上的资源,就会一直持续直到程序关闭,所以不再使用内存的时候,一定要自己动手来释放,否则会导致内存泄露。

释放动态内存空间函数free:

函数原型:

      - void free(void *ptr);

此函数没有返回值,传入的参数是指向动态内存空间的指针。

free函数将释放ptr参数指向的内存空间。该内存空间必须是由malloc,calloc或realloc函数申请的。否则该函数将导致未定义行为。若ptr参数是NULL将不指向任何操作。

注意:free函数不会修改指针ptr的值,调用free后ptr仍然指向它原来指向的地方。地址所指向为非法空间。

        free(ptr);  //动态内存关闭
	printf("你输入的整数是:%d\n",*ptr);   //打印结果随机数值

内存泄漏:不合理的大量申请内存且没有被释放的行为。

1,隐式内存泄漏(用完内存块后没有及时使用free函数释放)

C语言为避免内存泄漏,注意malloc和free成对存在,确保手动释放资源。

2,丢失内存块的地址(指向所申请内存块的指针地址被更改,导致free所释放对象错误,free执行错误,且内存未被结束)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!