动态开辟内存空间的方法: malloc calloc realloc
malloc: 在堆区开辟指定大小空间 ,返回空类型指针
开辟方法 : int*p=(int*)malloc(n); 开辟n个字节大小的空间,强制转换为int*类型,传给p。
calloc:在堆区开辟指定大小空间,并且将空间内各个字节初始化为0
开辟方法: int* p=(int*)calloc(n,size) 开辟n个字节大小为size的空间大小(类似于数组),强制转换为int*类型传给p;
realloc:改变堆区的动态内存空间大小;
开辟方法: realloc(arr,size) 即将arr指向的空间重新开辟为大小为size的空间;
在开辟过程中,如果内存之间的内存间隙不够,则会更换起始地址,重新寻址开辟新空间,如果开辟失败返回空地址,开辟成功返回 起始地址; 注: realloc(NULL,size) 当realloc接受到一块空地址,相当于malloc开辟一块新空间;
free(p); p=NULL;
在动态内存空间使用完毕的时候需要释放,不然会导致堆区内存空间挤压,内存碎片多,内存使用效率低。
并且如果在外部函数创建了动态内存,且未得到释放,当外部函数结束,且指针被销毁,导致无法找到动态内存,那么开辟的动态内
存将会发生内存泄露,无法被销毁;
柔性数组
在C99标准中,结构体的最后一个成员(最少两个成员)可以是大小未知的数组; 而这个数组可以采用动态内存开辟的方式创建
例子: struct S{int a; int arr[]/int arr[0] ; };
struct S* s= (struct S*) malloc( sizeof(struct S) + sizeof(int)*n )