1. 程式人生 > >【C++】動態記憶體分配

【C++】動態記憶體分配

如何動態新增資料,輸入長度不受限制?

陣列是不行的,它的長度為常量。有人就像將手動輸入一個長度,然後就有了如下程式碼:

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;
}