在C语言中,我们之前学过用数组去实现内存的分配,但是数组里面的内存是已经分配好的,是静态内存。那么如果我们想要实现动态内存的分配,这里就要用到分配内存的函数了,所以今天我就讲讲malloc函数和new函数的初步使用方法。
在建立一个线性表的时候,其分配的内存是每次建立一个节点就分配这个节点的内存,所以用malloc函数或者new函数去计算机的内存堆里面去找出一个空闲的内存,然后把数据放到里面去。
目录
1.malloc函数与free函数
malloc函数:
头文件:#include<stdlib.h>或者#include<malloc.h>
函数声明(函数原型)
void *malloc(int size); size表示分配的字节数
返回值:如果内存申请成功就会返回首地址,如果申请失败就会返回0
我们可以看出malloc是一个void*类型指针,所以我们在使用的时候要去声明分配的是什么类型的指针。
例如要分配一个指针的内存:
int * p;
p=(int *)malloc(sizeof ( int ) );//表示分配到一个int类型的内存,同时返回的是int类型的指针
废话不说,直接上代码。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p;
p = (int*)malloc(sizeof(int) * 100);//这里表示分配到100个int类型字节数的内存,等效于int a[100];
//还有就是malloc()函数里面的括号可以直接写入数字,比如我们知道int类型的字节数是4,那么我们也可以这么写p = (int*)malloc(400);其效果跟p = (int*)malloc(sizeof(int) * 100);是一样的
//此时p是表示一个有分配到内存的指针,p可以当做数组来使用
for (int i = 0; i < 100; i++)
p[i] = i + 1;//进行赋值
for (int i = 0; i < 100; i++)
printf("%d ", p[i]);
//也可以这样表示 printf("%d ", *(p+i));
free(p);//释放掉内存
}
相关注意事项:
1.千万要记住用malloc函数时要进行指针类型强制转换,否则会出现报错,因为void*类型指针不可以去自动转换到其他类型的指针,这里必须要强制转换才可以。
2.还有就是内存分配问题,例如 int p=(int *)malloc( 1 ); 这里分配到字节数为1的内存,但是我在里面写入一个整形变量是错误的,因为int类型变量字节数是4,我实际上只分配了一个字节数,所以另外三个字节数就无家可归了,会直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。所以这种写法是错误的。
free函数
函数定义:void free(void *addr)
作用:free函数的作用就是释放之前malloc函数申请的内存,把这些内存释放回到系统中。
那这里有人会问,干嘛要去释放掉呢?我之前分配好了,闲着没事干释放掉干嘛呢?这里我要说一下,如果你在一个程序里边申请了一大块的内存,这个大内存储存的数据占用了你大部分的CPU,那么你如果要再次申请另外一个大内存的话,这会导致系统发生故障,造成内存泄漏。所以我们在申请完了一个内存使用完后要去释放掉,正所谓 有借有还,再借不难嘛。
下面是关于free在C语言里面的使用;
char *p;
p=(char *)malloc(sizeof(char)*200);
//……
//……使用过程
//……
free(p);//用完后直接释放掉就OK了
2. new函数和delete函数
new和delete这两个函数在C++里面保留的关键字,类似于结构体struct一样,使用这两个看上去是函数,实际上是关键字,使用不属于任何头文件里边的函数。
new函数
new函数是C++里面的一个函数,new函数是另外一种申请内存的方式,但是与malloc不同,new函数在分配内存的同时会把对象也分配好,也就是说你的申请对象是int类型的,那么new也会返回这个对象,所以在使用new函数去申请内存的时候就不需要指针类型强制转换。在C++里面new函数基本上取代了malloc函数,因为new函数已经具备了malloc函数分配内存功能的同时,还可以对对象进行初始化,这里是malloc函数不具备的功能。
举个例子:
int *p=new int;
那么返回就是这个p指针的地址,那如果申请失败的话就返回0
在c++的编译器里面,这里我可以直接用C语言去使用这个函数。上代码:
#include<stdio.h>
int main()
{
int* p = new int(2);//申请一个int*类型空间,小括号里面的是初始化值为2,把分配好的内存和初始化的数据返回给地址p
printf("%d", *p);//输出结果为2
}
申请一个数组:
#include<stdio.h>
//申请一个数组
int main()
{
int* p = new int[100]();//把数组数据初始化为0,这个小括号是表示把里面100个数字都初始化为0,但是小括号只能是空的,里面不可以写入数字
//如果括号为空就是初始化为0
printf("%d", *(p+15));
delete [100]p;//释放内存
}
//输出结果为0
//如果想要进行数组初始化就要用到大括号
int* p = new int[10]{0,1,2,3,4,5,6,7,8,9};
delete函数
当然跟free一样,把申请的内存释放掉,其申请对象是new函数,所以delete与new一对,free与malloc一对。但是delete用法跟free有些不同。
1.如果是申请一个类型数据的话,就直接delete掉就好了
int* p = new int;
//……
//…………
delete p;
2.如果申请的是一个数组数据的话就加上数据的申请数量
int* p = new int[100];
//…… …………
delete [100]p;
完
申请内存空间不止这两种方法,还有其他的,例如calloc,realloc这两个申请函数,这里就不做介绍了。
小总结:熟练掌握动态内存分配函数,我们就可以去创建一个线性表了。如果在分配内存的时候,要看看是分配哪种类型的内存,是否想要初始化,如果要初始化的话最好就用new函数,这些就看个人实际情况吧。最重要啊,一定一定要记得释放内存,养成好习惯,要有借有还。
我就介绍到这里了,Thanks~~