malloc
在数组的定义中我们知道对数组空间的开辟是静态的,即我们可以有以下申明方式;
int arr[5];
以上的开辟方式有两个特点:
1.空间开辟大小是固定的
2.数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配
但是有些时候我们希望数组的大小可以根据自己的用户的意愿而去自己开数组的长度,因此便有了如下这种常见的错误:
int a;
printf("please input the size you want");
scanf("%d",&a);
int arr[a];
如此写法是不是看似无懈可击,但是遗憾的是,C语言中并不允许这样的数组声明方式,因此,我们需要使用一种新型的空间开辟方法:动态开辟,其中较为典型的便是使用malloc进行空间的开辟。
void *malloc( size_t size );
这个函数的意思是向内存申请一块连续可用的空间,并返回指向这快空间的指针
与之相对应的还有一个free函数,用来释放动态开辟的内存
void free (void* ptr);
例如以下代码:
#include<stdio.h>
int main()
{
int* pl = NULL;
int size;
printf("请输入你所想要数组元素的个数");
scanf("%d", &size);
pl = (int*)malloc(size*sizeof(int));//申请一块连续的内存大小
if (NULL != pl)//判断是否开辟成功
{
int i = 0;
for (; i < size; ++i)
{
*(pl + i) = i;
}
}
free(pl);//释放空间
pl = NULL;//释放指针
return 0;
}
通过代码我们可以知道,一个正确且完整的动态开辟的使用一定要注意以下几点:
malloc:
1.如果开辟成功,则返回一个开辟好空间的指针
2.如果开辟失败,则返回一个NULL指针,因此,malloc的返回值一定要做检查
3.返回指的类型为void*,所以malloc函数并不知道开辟空间的类型,里面的大小一定是按照字节数量开辟
4.如果参数大小为0,malloc的行为标准是未定义的,根据不同的编译器决定,这样使用歧义较大,一般不建议使用这种方法。
free:
1.只要是动态开辟的空间,当空间不再使用时都需要进行释放
2.如果pl指向的空间不是动态开辟的,则无法进行释放
3.如果参数pl是NULL指针,则函数什么事情也不做
【注】
动态开辟的空间指针返回值一定要进行NULL判断,即判断时否开辟成功;
使用free只是对空间进行了释放,这时指针仍存在,但是所指空间不可用,因此需要对该指针进行释放。