C语言中的malloc()和free()
malloc
//void *malloc(int size);
//malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
//malloc申请一个int型空间地址,大小为5个字节
(int *)malloc(4);//在堆区申请指定大小且连续的空间
//使用一个相应类型的指针来接受malloc申请的地址空间
int *p=(int*)malloc(4);
-
注意开辟内存不足或者超出数据类型的容积时会发出警告
-
如果malloc申请之后,记得及时free,否则会造成内存丢失,malloc申请的空间在程序关闭时会自动free,但是运行中的服务器几乎不会关闭,所以不用的空间及时释放
//malloc申请一维数组
int *p=(int*)malloc(sizeof(int)*5)//堆区开辟
//栈区开辟
int a[5];
int *p=&a[0];
一维数组指针空间开辟
int (*p)[3]=(char(*)[3])malloc(sizeof(int)*3)
//(*)[3]必须要这么写,这样是数组指针,如果写成*[3],只是指针数组
int a[3];
int(*p)[3]=&a;
free(p);
calloc
//calloc分配的空间初始化为0
int *p=(int*)calloc(5,sizeof(int));
//5代表申请的空间个数
free(p);
free
- 申请的内存地址不能重复释放,否则会崩溃
- 栈区空间不能释放,也会崩溃
realloc
void *realloc(void*ptr,size_t size)
//void*表示这个函数返回的指针变量,void*ptr值传进去的指针变量,realloc()会将ptr所值的内存块大小修改为size,并且将新的内存指针返回
-
假设原内存块大小为n,新开辟的空间大小为size
-
如果size<n,截取的内容不会发生变化
-
size>n,新分配的内存不会被初始化:
1.ptr=NULL,相当于调用malloc(size);
2.size=0,相当于free(ptr),ptr重新指向NULL
-
.....
总的来说,原来空间内存不够用了,用realloc函数开辟一块新的大空间,并且内部将原来数据拷贝到新空间,free原来指针。但是realloc函数太冗余,虽然可以带来很方便的使用,但是也很容易引发bug。
C++中的new和delete
C++ 中的 new/delete 和 new[]/delete[]深入理解
标签:malloc,int,void,free,new,指针,size From: https://www.cnblogs.com/HanXiaoCao/p/16909536.html