一.动态内存管理
1.malloc
void malloc (size_t size);这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针
如果开辟成功,则返回一个指向开辟空间的指针
如果开辟失败,则返回一个NULL,因此malloc的返回值一定要做检查
返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己来决定
如果参数的size为0,malloc的行为是标准为定义的,取决于编译器
注意:malloc的使用需要包含头文件stdlib.h
例子:
int main() { int*p = (int*)malloc(5 * sizeof(int)); if (p == NULL) { perror("malloc"); return 1; } int* p = (int*)calloc(5, sizeof(int)); if (p == NULL) { perror("malloc"); return 1; } int i = 0; for (i = 0; i < 5; i++) { printf("%d ", *(p + i)); } free(p); p = NULL; return 0; }2.free
c语言提供了另外一个函数free,专门用来做动态内存的释放和回收
函数原型
void free (void* ptr);free函数用来释放动态开辟的内存
如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的
如果参数ptr是NULL指针,则函数什么事都不做
使用同样需要包含头文件stdlib.h
注意:free的本质是把空间的使用权限还给操作系统,但是p的地址还有其他地址任然存在,此时的p就是野指针,之后需要给p赋值空指针p = NULL
还有一点,在释放时,p必须是第一个空间的地址。
3.calloc
在c语言中calloc同样用来动态内存分配,函数原型如下:
void* calloc (size_t num,size_t size);函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每一个字节赋值为0
与函数malloc的区别是会在返回地址之前把申请空间的每一个字节初始化为0
4.realloc
realloc函数让动态内存管理更加灵活
我们可以使用realloc对开辟的内存空间进行灵活调整,函数原型如下:
void* realloc (void* ptr, size_t size);ptr是要调整的内存地址
size是调整之后的新大小
返回值是调整之后的内存的起始位置
这个函数在调整原内存空间大小的基础上,还会将原来内存空间数据挪到新空间
realloc调整内存空间的是存在两种情况
情况一:原空间之后有足够大的空间
情况二:原空间之后没有足够大的空间
情况二会在堆区的内存中新找一块空间,并且满足新的大小要求,会将原来空间数据拷贝一份到新的空间,然后释放旧的空间,并且返回新的内存空间的起始地址
情况三:如果彻底调整失败会返回空指针
所以接收时应该这样接收
int*ptr = (int*)realloc(p, 4000); if (ptr != NULL) //调整成功 { p = ptr; }