2024年4月2日发(作者:)

在C语言中,堆(Heap)是用于动态内存分配的区域。我们可以

通过使用 `malloc()`, `calloc()`, `realloc()`, 和 `free()` 这几个函数来

在堆上进行内存的分配和释放。

以下是这些函数的基本用法:

1. `malloc(size_t size)`: 这个函数会从堆中分配一块连续的内存,

其大小由参数 `size` 指定。如果分配成功,函数会返回一个指向这块

内存的指针。如果分配失败,函数会返回 NULL。

例如:

```c

int *ptr = (int*)malloc(sizeof(int)); // 分配一个int大小的内存

if (ptr == NULL) {

// 内存分配失败

}

```

2. `calloc(size_t num, size_t size)`: 这个函数会从堆中分配一块连

续的内存,这块内存的大小由 `num` 和 `size` 两个参数确定。与

`malloc` 不同的是,`calloc` 会将分配的内存初始化为0。

例如:

```c

int *ptr = (int*)calloc(1, sizeof(int)); // 分配一个int大小的内存,

并将其初始化为0

if (ptr == NULL) {

// 内存分配失败

}

```

3. `realloc(void *ptr, size_t newSize)`: 这个函数会改变已经分配的

内存的大小。参数 `ptr` 是指向已经分配的内存的指针,`newSize` 是

新的内存大小。如果分配成功,函数会返回一个指向新内存的指针。

如果分配失败,函数会返回 NULL。

例如:

```c

int *newPtr = (int*)realloc(ptr, 2 * sizeof(int)); // 将ptr指向的内

存扩展为原来的两倍大小

if (newPtr == NULL) {

// 内存分配失败

}

```

4. `free(void *ptr)`: 这个函数会释放之前通过 `malloc`, `calloc`,

或 `realloc` 分配的内存。参数 `ptr` 是指向要释放的内存的指针。需

要注意的是,被释放的内存块不能再次使用,否则可能会导致未定义

的行为。

例如:

```c

free(ptr); // 释放ptr指向的内存

```

在使用这些函数时,我们需要注意避免内存泄漏,即分配了内存

之后没有正确地释放它。同时,我们还需要注意重复释放已经释放的

内存或者访问已经释放的内存都会导致未定义的行为。