11动态分配内存malloc/free
Posted qleo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11动态分配内存malloc/free相关的知识,希望对你有一定的参考价值。
动态分配内存
内存的申请和释放使用两个函数来实现: malloc/free。
malloc申请内存
#include<stdlib.h> int main() { int* p = (int*)malloc(100 * 4);// 申请100*4字节 for(int i = 0;i <100;i++){ p[i] = i * i; // 使用这块内存 } return 0; }
需要注意的是,要申请空间的大小以字节为单位,应用程序自己负责计算一共需要多少字节。比如要存储100个int,那么所需空间的大小应该是400字节,可以用malloc(100*4)或者malloc(100*sizeof(int))来指定大小。
Malloc的返回值指向了这块申请到的内存,应用程序需要把它强制转为指定的数据类型。这块内存和数组没有本质区别,用法完全相同。
free释放内存
#include<stdlib.h> void free(void*ptr);
实例:用Citizen表示一个市民,用Car表示一辆车。一个市民起初没有车,但未来可能有一辆车。
#include<stdlib.h> #include<string.h> struct Car{ char maker[32]; // 制造商 int price; // 价格 }; struct Citizen{ char name[32]; // 名字 int deposite; // 存款 Car* car; // NULL时表示没车 }; // 定义一个对象:开始没车。 Citizen shaofa = {"liyanyan",100,NULL}; // 后来,他可能买了一辆车。 void buy(Citizen* owner){ // 创建一个对象 Car* car = (Car*)malloc(sizeof(Car)); strcpy(car->maker,"BMW"); car->price = 10; // 保存此对象(确切地说是记住了指针) owner->car = car; // 车有了 owner->deposite -= car->price; //钱没了 } // 终有一天,这车会报废。 void discard(Citizen* owner,Citizen* other){ Car* car = owner->car; car->price *= 0.5; // 半价出售 other->car = car; // 别人拥有了这辆车 owner->deposite += car->price; // 不能free(car); //不能 free 这车在别人手里 owner->car = NULL; // 回到无车状态 }
以上是关于11动态分配内存malloc/free的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )
C语言中已经有了malloc和free,为啥还需要new和delete?