1 malloc
void *malloc( unsigned int num_bytes)
分配长度为num_bytes
个字节的内存块,返回值为无类型指针,该指针指向所分配内存块的起始位置,因此利用该无类型指针赋值给其他类型的指针的时候,需要进行强制类型转换。
int *p = (int *)malloc(sizeof(int) * 20);
当内存分配失败时,返回空指针NULL
。在使用malloc
分配内存之后,进行NULL
判断是一个良好的编程习惯。
2 calloc
void *calloc( unsigned int num, unsigned int size)
在内存的动态存储区分配num
个长度为size
的存储块,返回指向该存储块起始地址的无类型指针,若返回失败,返回NULL
。因此,同样需要对该函数返回值进行判断。
int *p = (int *)calloc(20, sizeof(int));
区别联系
calloc
与malloc
的一个相同点在于使用之后均需要free
(指针),释放内存块。- 不同点在于
calloc
分配内存之后,会自动将这一块的内存之初始化为0
,而malloc
则不会,分配内存的值为一些垃圾数值。因此,在使用malloc
函数之后,我们一般要调用函数memset
对内存进行初始化。
3 memset
void *memset(void *s, int ch, unsigned int size)
将s
所指向的内存块的前size
个字节全部设置为ch
对应的ASCii
值。 它是对较大数组或者结构体清零操作的最快方式。
memset(p, 0, 80);
4 realloc
void *realloc (void *p, unsigned int size);
如果已经通过malloc
或者calloc
获得了动态空间,想改变其大小,可以使用realloc
函数重新分配,将p所指的动态空间大小改变为size
,而p
的值不变,如果重新分配不成功,返回NULL
。原来空间的内容会保留。