malloc
void* malloc (size_t size);
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
1.如果开辟成功,则返回一个指向开辟好空间的指针。
2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
3.返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
4.如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
#include <stdio.h>
#include <stdlib.h>
int main() {
int* p = (int*)malloc(10 * sizeof(int));
if (p!=NULL) {
for (int i = 0; i < 10; ++i) {
p[i] = i;
}
}
for (int i = 0; i < 10; ++i) {
printf("%d\n",p[i]);
}
free(p);
p = NULL;
system("pause");
return 0;
}
}
callor
void* calloc (size_t num, size_t size);
函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
#include <stdio.h>
#include <stdlib.h>
int main() {
int* p = calloc(10, sizeof(int));
if (p != NULL) {
//for (int i = 0; i < 10; ++i) { //手动初始化
// p[i] = i;
//}
}
for (int i = 0; i < 10; ++i) {
printf("%d\n",p[i]);
}
free(p);
p = NULL;
system("pause");
return 0;
}
realloc
void* realloc (void* ptr, size_t size);
如果将分配的内存减少,realloc仅仅是改变索引的信息。
如果是将分配的内存扩大,则有以下情况:
1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。
free
搭配malloc calloc realloc使用
void free (void* ptr);
free函数用来释放动态开辟的内存。 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
如果参数 ptr 是NULL指针,则函数什么事都不做。