如何动态添加数据,输入长度不受限制?
数组是不行的,它的长度为常量。有人就像将手动输入一个长度,然后就有了如下代码:
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;
}