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 | 内存管理流程 )

malloc/free与new/delete的区别与联系

C语言中已经有了malloc和free,为啥还需要new和delete?

数据结构-堆栈动态存储

浅谈new/delete和malloc/free的用法与区别

动态内存函数+经典笔试题@动态内存管理---malloc +free + calloc + realloc