一、为什么会有动态内存分配
1.1向内存申请空间的两种形式:
在栈空间上申请空间(第一种:空间大小不可变):
----特点:申请时必须指明长度,一旦申请成功,空间大小不能改变。
int a = 0; //向栈空间申请4个字节大小空间
char b = 'a'; //向栈空间申请1个字节空间
char arr[10] ={ 0 }; //向栈空间连续申请10个char类型的大小空间(10个字节)
int s[10] = { 0 }; //向栈空间连续申请10个int类型大小的空间(40个字节)
在堆区上申请空间(第二种:空间大小可以改变):
二、动态内存开辟的函数:malloc
函数原型:void* malloc(size_t size);
1.函数返回类型是void*(指针类型);void*可以指向任何类型的指针;但是void类型指针不是进行解引用,必须进行强制类型转换才能进行解引用;
2.size是在堆区申请的空间大小,单位是字节;
例如:int *p=(int*)malloc(sizeof(int));
指在堆空间申请大小为4个字节的空间,并把首地址强制类型转换成整形(int)指针,然后赋给整形指针变量p;
3.头文件:
#include<stdlib.h>
注意事项:
1.申请(开辟)成功:会返回指向开辟空间的指针;
2.申请(开辟)失败:会返回一个NULL类型的指针,所以一定要对malloc的返回值进行检查;
3.返回值的类型为void*,所以malloc函数只管开辟空间,但是不知道空间的类型;具体在使用的时候由使用者决定;
4.当size为0时;malloc的行为是未被定义的,大小取决于编译器,可能申请成功,可能申请失败;
三、free函数
c语言中,提供一个一个函数free,用来释放动态内存空间,即申请了动态内存空间,就要去释放动态内存空间。
函数原型:void free(void * str);<