在程序运行过程,为了能够自由控制内存的声明周期、大小,会经常使用堆空间的内存。

1
2
int *p = (int *)malloc(4);
*p = 4;

malloc与free

malloc函数返回申请成功返回连续内存的最小地址,否则返回NULL。函数返回值类型是void *因此我们通过将来要存储的数据类型做类型强转。

1
2
3
4
char *c = (char *)malloc(10);
*c = 'c';
*(c+1) = 'b';
*(c+2) = 'j';

编译器会通过强转的类型决定指针一次访问操作多少个字节。

堆空间的内存特点是程序猿手动申请与释放,malloc对应释放堆空间的函数是free

1
2
3
int *p = (int *)malloc(sizeof(int) *10);

free(p);

new与delete

在C++中新增new函数来分配堆空间。

1
2
3
4
5
6
int *p = new int;
delete p;

int *p = new int[10]; // 分配10个int类型的字节堆空间
// 如果使用空间时使用[],释放是也要加上[]
delete[] p;

memset

memset函数是将较大的数据结构(比如对象、数组等)内存清零的比较快的方法

1
2
3
4
5
6
7
8
9
10
// 向堆空间申请未初始化的4个字节内存空间
int *p = new int;
// 从p地址开始的4个字节,每个字节都初始化为0
memset(p, 0, 4);

Person person;
person.id = 1;
person.age = 20;
person.height = 180;
memset(&person, 0, sizeof(person));

堆空间的初始化