当我们需要需要内存时,通常的开辟方法开辟的空间大小是提前设定好的的,如果要使用的空间大小在程序运行时才能知道,就要选择动态内存开辟了。
动态内存函数有malloc, calloc, realloc, free。
前三个函数是开辟或者改变空间的函数,free是释放内存的函数。
如果内存使用完没有用free释放掉,就会出现内存泄漏问题。
内存泄漏是指这样一种场景:程序分配了一块内存,但已经不再持有引用这块内存的对象(通是指指针),内存泄漏可能会导致系统响应速度变慢,进城占用的资源太多而被操作系统杀掉。所以申请的内存使用完后一定要将其free掉。
下面介绍如何动态开辟内存:
malloc:这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针,开辟成功后,返回一个指向开辟好空间的指针。开辟失败,就返回一个NULL指针。
所以在使用指针时,一定要判断指针是否为NULL!
函数原型:
void* malloc (size_t size);
内存释放和回收的函数free:
函数原型:
void free(void* ptr);
如果参数ptr指向的空间不是动态内存开辟的,那free函数的行为是未定义的。
如果参数ptr是NULL指针,则函数什么事都不做。
使用malloc和free函数时,要先声明头文件stdlib.h。
举个例子来使用这些函数:
#include<stdio.h>
#include<windows.h>
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
int num = 0;
scanf("%d", &num);
int* ptr = NULL;
ptr = (int*)malloc(num * sizeof(int));
if (NULL != ptr)//判断ptr指针是否为空
{
int i = 0;
for (i = 0; i<num; i++)
{
*(ptr + i) = 0;
}
}
free(ptr);//释放ptr所指向的动态内存
ptr = NULL;//如果不设置,ptr会成为野指针(悬垂指针),指向内存中的任意位置
return 0;
}
calloc
函数原型:void* calloc (size_t num, size_t size);
calloc函数与malloc的区别只有calloc会在返回地址之前把申请的空间的每个字节初始化为全0,而malloc为全cd。
举个例子说明calloc的使用:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = calloc(10, sizeof(int));
if(NULL != p)
{
//使用空间
}
free(p);
p = NULL;
return 0;
}
realloc
有时我们会发现开辟的空间太小了或者太大了,就要用到realloc函数对已开辟的空间大小做调整。
函数原型:
void* realloc (void* ptr, size_t size);
ptr是要调整的内存地址,size是调整之后新大小,返回值是调整之后的内存起始位置。
#include <stdlib.h>
#include <stdio.h>
int main()
{
int *p = NULL;
int *ptr = NULL;
ptr = realloc(ptr, 1000);
if (ptr != NULL)
{
p = ptr;
}
free(p);
return 0;
}
以上就是动态内存函数的基本介绍,在使用中一定要注意:
1.开辟内存后,使用ptr时要判断是否为NULL;
2.使用完内存后,一定要用free函数释放内存。
3.不要重复用free释放。