????calloc()
calloc()函数的声明,如下所示↓
为num元素数组分配一块内存,每个元素大小为字节长,并将其所有位初始化为零。有效的结果是分配一个(num*size)字节的零初始化内存块。
如果size为0,则返回值取决于特定的库实现(它可能是一个空指针,也可能不是),但返回的指针不应被解引用。
- 参数
num → 要分配的元素数量。
size → 每个元素的大小。
size_t → 是无符号整型。
- 返回值
成功时,指向函数分配的内存块的指针。
该指针的类型始终是void*,可以将其转换为所需类型的数据指针,以便可解引用。
如果函数分配请求的内存块失败,则返回一个空指针。
calloc()函数和malloc()函数最大的区别无非就是:calloc()比malloc()就是参数多了一个,以及calloc()的函数会把每个字节进行初始化为全0,而malloc()不会对每个字节的内容进行初始化。calloc()会在返回地址之前把申请的空间的每个字节初始化全0的。
????calloc()动态内存开辟使用
示例代码如下所示↓
运行结果如下↓
0 0 0 0 0 0 0 0 0 0
从这里我们可以发现,calloc()函数是帮我们进行了初始化为0的。那么如果我们把这里的代码改成是malloc()函数的形式看下会怎么样,其它不变来康康运行结果。
-842150451 → ⑩行
从这里我们可以知道 malloc() 函数并没有帮我们进行初始化。
????realloc()
realloc()函数的声明,如下所示↓
功能→改变由ptr指向的内存块的大小。
- 参数
ptr → 是要调整内存的地址。
size → 内存块的新大小,以字节为单位。调整之后新的大小。
size_t → 是无符号整型。
返回值→一个指向重新分配的内存块的指针,它可以与ptr相同,也可以是一个新位置。
该指针的类型为void*,可以将其转换为所需的数据指针类型,以便可解引用。注意→如果ptr是一个空指针,该函数的行为类似于malloc(),分配一个大小为字节的新块,并返回指向其开头的指针。 如下代码所示↓
实际上相当于等效。
????realloc()动态内存开辟使用
示例代码如下所示↓
根据调试查看是否 realloc() 调整了 p 的内存空间。
????内存开辟常见错误
Ⅰ→ 对NULL指针的解引用操作。
Ⅱ → 对动态开辟空间的越界访问。
Ⅲ → 使用 free() 释放非动态开辟的空间。
Ⅳ → 使用 free() 释放动态内存中的一部份。
Ⅴ → 对同一块动态开辟的空间,用 free() 进行多次的释放。
Ⅵ → 动态开辟的空间忘记释放会导致内存的泄露,是比较严重的。