11、动态分配内存malloc/free

动态分配内存

内存的申请和释放使用两个函数来实现: malloc/free。

malloc申请内存

#include
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
void free(void*ptr);

 

实例:用Citizen表示一个市民,用Car表示一辆车。一个市民起初没有车,但未来可能有一辆车。

#include

#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)