先决条件: 使用malloc(), calloc(), free()和realloc()在C中进行动态内存分配
名字分配和calloc()是动态分配内存的库函数。这意味着在运行时(程序执行)期间从堆段中分配了内存。
初始化:
malloc()分配给定大小(以字节为单位)的内存块, 并返回一个指向该块开头的指针。 malloc()不会初始化分配的内存。如果我们尝试在初始化之前访问内存块的内容, 则会遇到分段错误错误(或可能是垃圾值)。
void * malloc ( size_t size);
calloc()分配内存, 还将分配的内存块初始化为零。如果我们尝试访问这些块的内容, 则将获得0。
void * calloc ( size_t num, size_t size);
参数数量:
与malloc()不同, calloc()接受两个参数:
1)要分配的块数。
2)每个块的大小。
返回值:在malloc()和calloc()中成功分配后, 将返回指向内存块的指针, 否则返回NULL值, 指示分配失败。
例如, 如果我们要为5个整数的数组分配内存, 请参见以下程序:
// C program to demonstrate the use of calloc()
// and malloc()
#include <stdio.h>
#include <stdlib.h>
int main()
{
int * arr;
// malloc() allocate the memory for 5 integers
// containing garbage values
arr = ( int *) malloc (5 * sizeof ( int )); // 5*4bytes = 20 bytes
// Deallocates memory previously allocated by malloc() function
free (arr);
// calloc() allocate the memory for 5 integers and
// set 0 to all of them
arr = ( int *) calloc (5, sizeof ( int ));
// Deallocates memory previously allocated by calloc() function
free (arr);
return (0);
}
通过使用malloc()和memset(), 我们可以实现与calloc()相同的功能,
ptr = malloc (size);
memset (ptr, 0, size);
注意:最好使用malloc而不是calloc, 除非我们想要零初始化, 因为malloc比calloc快。因此, 如果我们只想复制某些东西或执行不需要用零填充的块, 那么malloc是一个更好的选择。