1. 使用malloc()函数需要链接的头文件:
头文件 #include <malloc.h> 或 #include <alloc.h> ,这两个头文件内容一致,用哪个都行
2. malloc()函数原型是 void* malloc(unsigned int num_bytes);
功能:
(1)malloc函数的功能是内存上分配一段长度为 num_bytes 个 byte 大小的空间 (num_bytes的数值大小最大为 unsigned int)
(2)如果成功在内存上分配一段空间则返回一个 void类型的指针 ,因此,如果我们想使用一个int型指针指向这段空间那么需要将返回值进行强转成int*类型
int *p = (int*)malloc(sizeof(int)*10);
若上述代码不使用(int*)进行强转,那么会报错,因为不可以将void*直接赋值给int*类型的变量
(3)若申请内存不成功,则会返回一个空指针 NULL
(4)当申请的这段内存不再使用时,用free()函数释放掉
free(p);
3. malloc 与 new 的区别:
new 返回的是指定类型的指针,new的参数也是要新建多少个指定类型的数据对应的空间
malloc返回的是一个void类型的指针,malloc的参数是字节个数
4. 最常用的方式就是申请空间,然后向数组一样使用它:
#include <iostream>
#include <math.h>
#include <malloc.h>
int main()
{
int *p;
p = (int*)malloc(sizeof(int)*10);
for(int i=0;i<10;i++)
{
p[i]=i*10;
}
for(int i=0;i<10;i++)
{
std::cout<< p[i] << std::endl;
}
free(p); //记得free()
return 0;
}
5. malloc注意事项:
如果我们做了这样的操作:只申请了1个byte大小的空间却想向里面塞入4个byte大小的int型数据,这就会导致超出指针p申请到的可用的空间了,这会导致我们侵犯了其他的显存空间,从而可能引发不知名错误
#include <iostream>
#include <math.h>
#include <malloc.h>
int main()
{
int *p;
p = (int*)malloc(1);
std::cout<<sizeof(int)<<std::endl; //大小为4
p[0]=5;
std::cout<<p[0]<<std::endl;
std::cout<<p[1]<<std::endl;
free(p); //记得free()
return 0;
}
如下图示:指针P只申请了0号空间,但执行了p[0]=5; 语句后,int型数据5占用了0,1,2,3四块空间,那么,若原来1,2,3号空间上的内容就会被覆盖掉
但是,指针p由于是一个int型指针,那么它的读取就一定是假定指向的空间都是以int型数据大小划分的,所以每次会从P的位置开始,每四块空间作为一个数据读取,并输出,这就是为啥我们会读到数字5 。这也是为啥12行的 p[1] 也可以输出,但是大家的输出内容应该不太一样或直接报错,因为这相当于让指针指向不归它管的内存块了