赞
踩
目录
我们的程序对象存储的位置有静态内存和动态内存还有栈内存,静态内存里存储着局部static对象,类的static数据成员以及定义在任何类外的变量,栈内存里保存着定义在函数内的非static对象,分配在静态内存或栈内存中的对象有着严格的生存期,由编译器自动生成和销毁。但有时我们需要在程序运行时动态分配对象,这个时候就需要用到动态内存了,动态内存的生存期由程序来控制,也就是说,我们必须在使用完程序后释放这部分内存,否则就会造成内存泄漏。
c语言中动态内存管理的有四个函数:malloc,calloc,free,realloc。使用它们都需要引用<stdio.h>或<malloc.h>头文件。
使用格式:void*malloc(size_t)size_t 要开辟的字节数
例如:
int* p=malloc(40);
上诉代码指的是开辟一个40个字节的空间。
注意:如果我们开辟的空间太大,我们是开辟不出来的。因为在Windows系统中堆区的大小大概在1.5~1.9GB 。
由于堆区和栈区不同,在开辟一个空间后,如果使用过后不去把他释放掉,那它会一直存在那里,别人也无法使用。
当我们free掉内存空间后,p仍旧指向这片空间,要是我们不小心再次使用,就会发生非法访问,所以此时就要将指针变量指向NULL。
注意:以下三种情况使用free可能使函数崩掉
1.连续多次释放
- int* p=malloc(100);
- free(p);
- free(p);
2.free(野指针);
3.free栈上的空间
- int a=0;
- int* p=&a;
- free(p);
calloc函数和malloc函数作用差不多,但是参数不同
使用格式:void *calloc( num, size_t );
num 表示要开辟的个数
size_t表示开辟一个占据的字节数
例如:
int* p = (int*)calloc(10,4)
表示开辟10个,每个占据4个字节。
同时作用有些差异
malloc开辟的空间里面是随机值
calloc开辟的空间并且初始化了,初始化为0
使用格式:void *realloc( void *memblock, size_t);
void *memblock 第一次开辟空间的地址,要是没有第一次开辟,可以写成NULL 相当于第一次开辟了
size_t开辟空间的总大小 == 第一次的 + 追加的
三种内存的扩容方式:
1.后面的区域比较充裕,直接在原内存后面续上
2.前面有空余:将内存中的内容赋值到前面,后面空闲出来的内存相当于对其扩充内存
3.堆内存不足,扩展空间失败,realloc函数返回NULL。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。