1. malloc
- 在堆区申请一个指定大小、连续的空间并返回空间地址
(int*)malloc(4);
// 申请了一个四个字节的空间并且规定该空间为一个int型变量空间,而不是别的。
int *p =(int*)malloc(4);
// 由于malloc返回一个 空间地址,所以需要一个相应类型的指针来接收改地址
int *p;
p=(int*)malloc(4);
//也可以分写
1.1 size_t
1.2 malloc可申请的字节数
2G=210241024*1024个字节
1.2.1 整形常量溢出
例如int类型是-231~231个字节
int *p=(int*)malloc(2*1024*1024*1024);
//超出int型的容积,会出现常量溢出的警告
int *p=(int*)malloc(2*1024*1024*1024-1);
当把申请空间减去一部分是,由于先算乘法,再算加法,第一次乘法溢出,第二次用一个溢出的数再去运算还是溢出,会报两次溢出警告
两种解决方法
int *p=(int*)malloc(2u*1024u*1024u*1024u);
加上u变成无符号的整形,范围是0~2^32个字节
还可以申请多次
int *p1=(int*)malloc(1024*1024*1024);
int *p2 =(int*)malloc(1024*1024*1024);
- 当你申请了一个3个字节的空间,并把这个空间给了一个int型,因为int型为4字节,少了一个字节,
int *p = (int*)malloc(3);
free(p);
//当释放p空间的时候会出现错误,控制台光标卡在释放空间的位置
- 当p被赋值给一个地址,就不要给他在赋值另一个地址了。原地址会被后赋值的地址覆盖掉,但是原地址不会被释放,但是也找不到他,就造成了内存的丢失。
int *p = (int*)malloc(4);
p = (int*)malloc(4); // 原地址会被覆盖掉,造成内存丢失
whil(1)
{
malloc(4);
// 当他不断地运行下去,你电脑的内存就会不断地变小
}
- malloc申请的空间在关闭程序的时候会自动关闭,但是运行的服务器几乎不会关机,所以需要free来释放空间。但是在自己编程的过程中,不用的空间一定要马上释放。
1.3 malloc一维数组
堆区申请内存
int *p=malloc(sixeof(int)*5); //申请了5个int类型的空间
栈区申请内存
int a[5];
int *p=&a[0];
- 一维数组指针空间申请
int (*p)[5]=(int (*)[5])malloc(4*5);
//(*)[5]必须要这么写,这样是数组指针,如果写成*[5],只是指针数组
int a[5];
int (*p)[5]=&a;
free(p);
1.4 calloc
与malloc的功能相似,申请一段空间数组,但是calloc在申请空间的同时就自动的给申请的空间赋值为0。
int *p=(int*)calloc(5,4); // 5代表要申请的空间个数,4代表每个空间的大小。
free(p);
relloc
修改申请空间的大小
int *p=(int*)malloc(12); //为p申请了一个12个字节的地址
int *p1=(int*)realloc(p,20); //
free(p)
2. free
释放某个地址空间的,被释放的地址的值不是0,而是某个初始值。
int *p = (int*)malloc(4);
*p=12;
free(p);
-
内存地址是不能重复释放的,会出现崩溃
-
不能释放栈区空间,会出现崩溃