【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>

扫描二维码关注公众号,回复: 4173190 查看本文章

系统通过内存管理器(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;
}

猜你喜欢

转载自blog.csdn.net/u013066730/article/details/84258489