C中开辟内存空间的两种方式
1、静态开辟内存
这种开辟内存空间的特点是所开辟的内存是在栈中开辟的固定大小的
例如:
int a;
int b[5];
a是4个字节,数组b是20字节
这种方式数组在申明时必须指定其长度,因为数组的内存是在编译时分配好的。
如果我们想在程序运行时才确定一个数组的大小,静态开辟内存空间的方法是不行的
例如:
int n;
scanf("%d",&n);
int a[n];
这样编写会在编译时出错
2、动态开辟内存
在C中动态开辟空间有三个函数:malloc(),calloc(),realloc(),这三个函数都是向堆中申请的内存空间。
在堆中申请的内存空间不会像在栈中存储的局部变量一样,函数调用完会自动释放内存,需要我们手动释放,就需要free()函数来完成。
这里只讲用malloc()函数实现动态分配和free()函数释放内存
(1)malloc()函数
①malloc()函数会向堆中申请一片连续的可用内存空间。
②若申请成功,返回指向这片内存空间的指针,若失败,则会返回NULL,所以我们在用malloc()函数开辟动态内存之后,一定要判断函数返回值是否为NULL。
③返回值的类型为void* 型,malloc()函数并不知道连续开辟的sizeof个字节是存储什么类型的数据,所以需要我们在malloc()前加强制转换,转换为我们所需的类型。如:(int*)malloc(sizeof(int)*n)
malloc()具体用法
int *p=NULL;
int n;
scanf("%d",&n);
p=(int*)malloc(sizeof(int)*n);
if(p!=NULL)
{
//需要进行的操作
}
这时就相当于创建了一个数组p[n],这个n的值并不需要像定义一个普通数组一样必须是常量,可以是用户输入
(2)free()函数
在堆中申请的内存空间不会像在栈中存储的局部变量一样,函数调用完会自动释放内存,如果我们不手动释放,直到程序运行结束才会释放,这样就可能会造成内存泄漏,即堆中这片内存中的数据已经不再使用,但它一直占着这片空间,所以当我们申请的动态内存不再使用时,一定要及时释放。
free()具体用法
int *p=NULL;
int n;
scanf("%d",&n);
p=(int*)malloc(sizeof(int)*n);
if(p!=NULL)
{
//需要进行的操作
}
// 操作完成,不再使用这片内存空间
free(p);
p=NULL;