【C++】動態記憶體分配
阿新 • • 發佈:2018-11-21
如何動態新增資料,輸入長度不受限制?
陣列是不行的,它的長度為常量。有人就像將手動輸入一個長度,然後就有了如下程式碼:
int n = 0; scanf("%d", &n); int Contact[n];
編譯錯誤。我只能說你太年輕,陣列的長度是常量呀,你這分明是變數。
所以這就用到了malloc函式。
malloc函式
void* malloc(int size)
引數size:指定要申請的記憶體空間的大小
返回值:void*,指向這一塊記憶體地址
free函式
void* free(void* ptr)
ptr:先前malloc返回的記憶體地址
返回值:void*,指向這一塊記憶體的地址
需要引用標頭檔案#include <stdlib.h>
系統通過記憶體管理器(MM,memory manager)來管理一堆閒置記憶體,如果你不free,就不會回收,會造成資源浪費。
void* ptr = malloc(1024);//申請,從MM借出記憶體 free(ptr);//釋放記憶體 int size = 1000 * sizeof(Contact); Contact* p = (Contact*) malloc(size); free(p);
簡單的例子
#include "pch.h"
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
int main()
{
char* p = (char*)malloc(8);
for (int i=0; i<8; i++)
{
p[i] = i + 1;
printf("%d \n", p[i]);
}
free(p);
std::cout << "Hello World!\n";
return 0;
}
自定義型別記憶體申請
#include "stdio.h" #include "stdlib.h" #include "string.h" struct Contact { int id; char name[16]; }; int main() { int size = 4 * sizeof(Contact); Contact* p = (Contact*)malloc(size); p[0].id = 1; strcpy_s(p[0].name, "shaofa"); free(p); }
為什麼free時只需要輸入首地址?
MM會對借出的記憶體進行標記,它保證記憶體不會“重疊”,同時你給個首地址就能釋放掉一段記憶體。
申請記憶體和普通宣告變數有什麼卻別?
Contact a;//a是一個物件,即存放著一個物件的資料
Contact* p = (Contact*)malloc(sizeof(Contact));//p指向了一個物件
稍複雜的例子
程式功能:一個人擁有存款,他可以買車,存款會減少。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct Car
{
char maker[32];
int price;
};
struct Citizen
{
char name[32];
int deposite;
Car* car;
};
void buy(Citizen* owner)
{
Car* car = (Car*)malloc(sizeof(Car));
strcpy_s(car->maker, "chevrolet");
car->price = 10;
owner->car = car;
owner->deposite -= car->price;
}
void buy_new(Citizen* owner)
{
free(owner->car);
owner->car = NULL;
Car* car = (Car*)malloc(sizeof(Car));
strcpy_s(car->maker, "beichi");
car->price = 10;
owner->car = car;
owner->deposite -= car->price;
}
int main()
{
Citizen nick = {"nick", 100, NULL};
buy(&nick);
return 0;
}