C语言 动态内存分配
C 语言允许动态分配内存,需要时随时申请,不需要时随时释放。
一、什么是内存的动态分配
动态分配不同于全局变量和局部变量,可以由编程者的意愿在需要时分配空间,并在不需要时释放空间,无需听从系统的安排。
二、进行动态内存分配
首先需要
#include <stdlib.h>
1.malloc
1 |
|
- 申请一大块区域,并返回一个地址信息
- 返回的地址信息是 void 型,因此需要强制类型转换
- 分配失败会返回空指针
2.calloc
1 |
|
与 malloc() 的参数不同,malloc 是申请一个区域(n*size),calloc 是申请多个小区域(size,n)
但这一点可以看作等价的,只是填入参数的方式不同,反正都是当作数组使用
calloc 会自动将数组置为 0 ,而 malloc 不会
返回的地址信息是 void 型,因此需要强制类型转换
分配失败会返回空指针
3.realloc
1 |
|
用于改变已经通过 malloc/calloc 获得的空间的大小。
例如:
1
2
int *p = (int*)malloc(sizeof(int) * 10);
realloc(p, sizeof(int) * 50);将空间由 10 个单元扩大至 50 个单元。
4.free
1 |
|
用于释放申请的空间。
申请的空间使用后应该及时释放。静态内存的数量在编译时是固定的,在程序运行的期间也不会改变。若在函数中申请空间,并在退出函数前没有及时释放,这个空间仍然会占用内存且无法被访问。如果这个函数被重复多次,可能会将内存耗尽,这类问题被称为内存泄漏。
三、void 指针类型
类型为 void 的指针表示“不知道应该指向什么类型的指针”。这种指针无法存取数据,只有在转换为其它类型后才能被正确访问。
部分编译器会在进行地址赋值时,将 void 类型的指针自动类型转换,但最好还是手动进行强制转换。
1
2
3
4
int *p;
p = malloc(大小);
或
p = (int*)malloc(大小);
参考
- C程序设计
- C Primer Plus
- C 语言教程 | 菜鸟教程