11动态堆内存空间分配与释放
#include <stdlib.h>//栈:int a=5;===4字节,int a[5];===4*5=20字节
void* malloc (
size_t size // 预分配字节数
);
成功返回所分配内存的起始地址,失败返回NULL。不初始化。
void* calloc (
size_t nmemb, // 元素数
size_t size // 元素字节数
);
成功返回所分配内存的起始地址,失败返回NULL。初始化为0。
所有通过动态内存分配所得到内存都要通过free()函数释放。
void free (
void* ptr // 内存地址
);
void* realloc (
void* ptr, // 原地址
size_t size // 新字节数
);
成功返回调整后的内存地址,失败返回NULL。新增部分不做初始化。
如果ptr为NULL,则与malloc()等效。
如果size为0,则与free()等效。
可能会分配新的内存空间,如果发生这种情况,原内存会自动释放,其内容会拷贝到新内存中,但是如果分配失败,原内存不会释放。
#include <stdio.h> #include <stdlib.h> //int* p;p==永远都是保存一块地址或区域 书架第二行,第四列有一本书 //*p==地址或区域上的值或目标 C语言 int main() { int* p=(int*)malloc(sizeof(int));//动态申请4个字节大的堆内存 *p=1;//写一个游戏超级武器的爆率0.00001% printf("%d\n",*p);//1 //printf("%p\n",p); free(p); //p=NULL; //printf("%p\n",p); //*p=2;//100% printf("%d\n",*p);//1?2? p=(int*)calloc(5,sizeof(int));//5*4 int i; for(i=0;i<5;i++)//0-4 p[i]=i; for(i=0;i<5;i++) printf("%d ",p[i]); printf("\n"); free(p); p=(int*)realloc(NULL,512*sizeof(int));//512*4 void* if(!p) { return -1; } *p=10000; //如果发现p指针分配内存不够用了,怎么办? int* p2=(int*)realloc(p,1024*sizeof(int));//1024*4 //重新分配的内存是根本P的申请内存去增大, //会自动把p内存里面的值直接拷贝到p2的内存。 if(!p2) { return -1; } printf("*p=%d,*p2=%d",*p,*p2); free(p); free(p2); return 0; }