文章目录
- 前言
- 一、什么是动态内存分配?
- 二、malloc()和free()
-
- 2.1 malloc()介绍
- 2.2 malloc()的使用
- 2.3 free()介绍
- 三、calloc()
- 四、realloc()
- 总结
前言
本篇文章介绍c语言中实现动态内存管理的库函数,比如malloc()、free()、calloc()、realloc()
一、什么是动态内存分配?
在一般情况下,通过以下方式开辟内存空间
int var = 20; //在栈空间开辟4个字节的 char str[10] = {0}; //在栈空间开辟10个字节连续的空间
上面开辟空间的方式有两个特点:
- 开辟空间的大小是固定的,不可变的
- 在栈中开辟,并且在编译时分配空间
当需要在程序运行过程中才能知道所有空间的大小时,这时候就需要动态内存分配。
动态内存分配是指在程序运行过程中,可以动态地向操作系统申请内存空间。
在c语言中,可以借助malloc()、free()、calloc()、realloc()这几个库函数实现动态内存的管理。
二、malloc()和free()
2.1 malloc()介绍
下面是cplusplus网站关于malloc()函数的介绍,如下:
作用:申请size个字节内存空间
说明:
- 申请size个字节的空间
- 分配的内存空间是没有经过初始化的,存储的是不定值
返回值说明:
- 如果传入的参数size为0,返回值为的标准未定义,由实现的编译器决定。
- 如果申请成功,返回这块内存空间的起始位置的指针,类型为void*,可以通过强制类型转换为期望解引用的类型
- 如果申请失败,返回一个空指针NULL
2.2 malloc()的使用
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<errno.h> int main() { //申请40个字节 int* p = (int*)malloc(40); //判断申请是否成功 if (NULL == p) { printf("%s", strerror(errno)); return 1; } //使用空间 int i = 0; int sz = 40 / sizeof(int); for (i = 0; i < sz; i++) { *(p + i) = i; } //打印 for (i = 0; i < sz; i++) { printf("%d ", *(p + i)); } //使用完之后,释放空间 free(p); p = NULL; return 0; }
2.3 free()介绍
下面是cplusplus网站关于free()函数的介绍,如下:
作用:释放通过malloc()、calloc()、realloc()函数申请的空间
说明:
- 如果ptr不是指向由malloc()、calloc()、realloc()申请的空间,那么释放时会引起未定义
- 如果ptr为空指针,那么这个函数什么也不做。
- 释放ptr指向的空间时,ptr本身的值不会被改变,即ptr依然会指向被释放的空间。所以,在释放ptr指向的空间后,应将ptr置为空指针。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<errno.h> int main() { //申请40个字节 int* p = (int*)malloc(40); //判断申请是否成功 if (NULL == p) { printf("%s", strerror(errno)); return 1; } //使用空间 int i = 0; int sz = 40 / sizeof(int); for (i = 0; i < sz; i++) { *(p + i) = i; } //使用完之后,释放空间 free(p); p = NULL; return 0; }
通过vs的内存监视查看(未释放前)
利用free()释放p指向的空间后
通过结果得出,