C语言 动态内存分配

C 语言允许动态分配内存,需要时随时申请,不需要时随时释放。

一、什么是内存的动态分配

动态分配不同于全局变量和局部变量,可以由编程者的意愿在需要时分配空间,并在不需要时释放空间,无需听从系统的安排。

二、进行动态内存分配

首先需要 #include <stdlib.h>

1.malloc

1
int *a = (int *)malloc(sizeof(int) * n);
  • 申请一大块区域,并返回一个地址信息
  • 返回的地址信息是 void 型,因此需要强制类型转换
  • 分配失败会返回空指针

2.calloc

1
int *a = (int *)calloc(sizeof(int), n);
  • malloc() 的参数不同,malloc 是申请一个区域(n*size),calloc 是申请多个小区域(size,n)

    但这一点可以看作等价的,只是填入参数的方式不同,反正都是当作数组使用

  • calloc 会自动将数组置为 0 ,而 malloc 不会

  • 返回的地址信息是 void 型,因此需要强制类型转换

  • 分配失败会返回空指针

3.realloc

1
a = (int *)realloc(a, nmax);

用于改变已经通过 malloc/calloc 获得的空间的大小。

例如:

1
2
int *p = (int*)malloc(sizeof(int) * 10);
realloc(p, sizeof(int) * 50);

将空间由 10 个单元扩大至 50 个单元。

4.free

1
free(a);

用于释放申请的空间。

申请的空间使用后应该及时释放。静态内存的数量在编译时是固定的,在程序运行的期间也不会改变。若在函数中申请空间,并在退出函数前没有及时释放,这个空间仍然会占用内存且无法被访问。如果这个函数被重复多次,可能会将内存耗尽,这类问题被称为内存泄漏。

三、void 指针类型

类型为 void 的指针表示“不知道应该指向什么类型的指针”。这种指针无法存取数据,只有在转换为其它类型后才能被正确访问。

部分编译器会在进行地址赋值时,将 void 类型的指针自动类型转换,但最好还是手动进行强制转换。

1
2
3
4
int *p;
p = malloc(大小);

p = (int*)malloc(大小);

参考