目录
1、当前我们知道的内存使用方式
1.创建一个变量
int a = 10; //局部变量 - 栈区
int g_a = 10; //全局变量 - 静态区
栈区:局部变量、函数的形参、返回数据、返回地址等(临时)
自动被释放
堆区:动态内存分配
一般由程序员分配释放
静态区:全局变量、静态变量(static)
由系统释放
2.创建一个数组
局部范围内的数组在栈区
全局范围内的数组在静态区
2、为什么存在动态开辟空间
对于空间的需求,不仅仅是上述的情况。
有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。
这时候就只能试试动态存开辟了。
动态开辟空间在堆区。
3、malloc和free
1.C语言提供了一个动态内存开辟的函数:void* malloc (size_t size);
void* - 由用户来决定返回的是什么类型
size_t - 无符号整型
size - 开辟多少个字节
举例:
int* p = (int*)malooc( 10*sizef(int) );//10个整型的字节大小
malooc函数会返回一个指向开辟好空间的指针,或者是NULL指针,因此malloc的返回值一定要做检查。
2.C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的。
void free (void* ptr);
void* ptr - 开辟空间的数据块的首地址
注意:free之后,ptr的地址还在,我们要把地址ptr赋值为空指针,以避免适应使用ptr找到这个地址。
如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
如果参